Prepare next development cycle testing github/testing
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 16 Mar 2024 09:03:00 +0000 (10:03 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 16 Mar 2024 09:03:00 +0000 (10:03 +0100)
805 files changed:
.gitignore
.gitmodules [new file with mode: 0644]
.project
COPYING
Makefile [new file with mode: 0644]
NOTICE [new file with mode: 0644]
README [new file with mode: 0644]
branch.mk [new file with mode: 0644]
configure [new file with mode: 0755]
core/.gitignore [deleted file]
core/org.argeo.entity.api/.classpath [deleted file]
core/org.argeo.entity.api/.gitignore [deleted file]
core/org.argeo.entity.api/.project [deleted file]
core/org.argeo.entity.api/META-INF/.gitignore [deleted file]
core/org.argeo.entity.api/bnd.bnd [deleted file]
core/org.argeo.entity.api/build.properties [deleted file]
core/org.argeo.entity.api/pom.xml [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/EntityConstants.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/EntityDefinition.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/EntityNames.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/EntityType.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/EntityTypes.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/JcrName.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/Term.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/TermsManager.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/Typology.java [deleted file]
core/org.argeo.entity.api/src/org/argeo/entity/entity.cnd [deleted file]
core/org.argeo.entity.core/.classpath [deleted file]
core/org.argeo.entity.core/.gitignore [deleted file]
core/org.argeo.entity.core/.project [deleted file]
core/org.argeo.entity.core/META-INF/.gitignore [deleted file]
core/org.argeo.entity.core/bnd.bnd [deleted file]
core/org.argeo.entity.core/build.properties [deleted file]
core/org.argeo.entity.core/pom.xml [deleted file]
core/org.argeo.entity.core/src/org/argeo/entity/core/JcrEntityDefinition.java [deleted file]
core/org.argeo.entity.ui/.classpath [deleted file]
core/org.argeo.entity.ui/.gitignore [deleted file]
core/org.argeo.entity.ui/.project [deleted file]
core/org.argeo.entity.ui/META-INF/.gitignore [deleted file]
core/org.argeo.entity.ui/bnd.bnd [deleted file]
core/org.argeo.entity.ui/build.properties [deleted file]
core/org.argeo.entity.ui/pom.xml [deleted file]
core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java [deleted file]
core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java [deleted file]
core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/SingleTermPart.java [deleted file]
core/org.argeo.suite.core/.classpath [deleted file]
core/org.argeo.suite.core/.gitignore [deleted file]
core/org.argeo.suite.core/.project [deleted file]
core/org.argeo.suite.core/META-INF/.gitignore [deleted file]
core/org.argeo.suite.core/OSGI-INF/maintenanceService.xml [deleted file]
core/org.argeo.suite.core/OSGI-INF/termsManager.xml [deleted file]
core/org.argeo.suite.core/bnd.bnd [deleted file]
core/org.argeo.suite.core/build.properties [deleted file]
core/org.argeo.suite.core/pom.xml [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/RankedObject.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/RankingKey.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/SuiteRole.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteMaintenanceService.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTerm.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTermsManager.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTypology.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/library/DocxExtractor.java [deleted file]
core/org.argeo.suite.core/src/org/argeo/suite/util/XPathUtils.java [deleted file]
core/org.argeo.suite.theme.default/.gitignore [deleted file]
core/org.argeo.suite.theme.default/.project [deleted file]
core/org.argeo.suite.theme.default/META-INF/.gitignore [deleted file]
core/org.argeo.suite.theme.default/OSGI-INF/cmsTheme.xml [deleted file]
core/org.argeo.suite.theme.default/bnd.bnd [deleted file]
core/org.argeo.suite.theme.default/build.properties [deleted file]
core/org.argeo.suite.theme.default/pom.xml [deleted file]
core/org.argeo.suite.theme.default/rap/work.css [deleted file]
core/org.argeo.suite.theme.default/swt/app.css [deleted file]
core/org.argeo.suite.ui.rap/.gitignore [deleted file]
core/org.argeo.suite.ui.rap/.project [deleted file]
core/org.argeo.suite.ui.rap/META-INF/.gitignore [deleted file]
core/org.argeo.suite.ui.rap/OSGI-INF/cmsWebApp.xml [deleted file]
core/org.argeo.suite.ui.rap/bnd.bnd [deleted file]
core/org.argeo.suite.ui.rap/build.properties [deleted file]
core/org.argeo.suite.ui.rap/pom.xml [deleted file]
core/org.argeo.suite.ui/.classpath [deleted file]
core/org.argeo.suite.ui/.gitignore [deleted file]
core/org.argeo.suite.ui/.project [deleted file]
core/org.argeo.suite.ui/META-INF/.gitignore [deleted file]
core/org.argeo.suite.ui/OSGI-INF/cmsApp.xml [deleted file]
core/org.argeo.suite.ui/OSGI-INF/dashboard.xml [deleted file]
core/org.argeo.suite.ui/OSGI-INF/dashboardLayer.xml [deleted file]
core/org.argeo.suite.ui/OSGI-INF/footer.xml [deleted file]
core/org.argeo.suite.ui/OSGI-INF/header.xml [deleted file]
core/org.argeo.suite.ui/OSGI-INF/l10n/bundle.properties [deleted file]
core/org.argeo.suite.ui/OSGI-INF/l10n/bundle_de.properties [deleted file]
core/org.argeo.suite.ui/OSGI-INF/l10n/bundle_fr.properties [deleted file]
core/org.argeo.suite.ui/OSGI-INF/leadPane.xml [deleted file]
core/org.argeo.suite.ui/OSGI-INF/loginScreen.xml [deleted file]
core/org.argeo.suite.ui/OSGI-INF/recentItems.xml [deleted file]
core/org.argeo.suite.ui/bnd.bnd [deleted file]
core/org.argeo.suite.ui/build.properties [deleted file]
core/org.argeo.suite.ui/config/cmsApp.properties [deleted file]
core/org.argeo.suite.ui/config/dashboard.properties [deleted file]
core/org.argeo.suite.ui/config/dashboardLayer.properties [deleted file]
core/org.argeo.suite.ui/config/footer.properties [deleted file]
core/org.argeo.suite.ui/config/header.properties [deleted file]
core/org.argeo.suite.ui/config/leadPane.properties [deleted file]
core/org.argeo.suite.ui/config/loginScreen.properties [deleted file]
core/org.argeo.suite.ui/config/recentItems.properties [deleted file]
core/org.argeo.suite.ui/pom.xml [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultDashboard.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultFooter.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLoginScreen.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteMsg.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewPersonPage.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewPersonWizard.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewUserWizard.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/AbstractConnectContextMenu.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/ConnectAbstractDropDown.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/DelayedText.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java [deleted file]
core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TreeOrSearchArea.java [deleted file]
core/pom.xml [deleted file]
dep/.gitignore [deleted file]
dep/org.argeo.suite.dep.e4.rap/.gitignore [deleted file]
dep/org.argeo.suite.dep.e4.rap/META-INF/.gitignore [deleted file]
dep/org.argeo.suite.dep.e4.rap/bnd.bnd [deleted file]
dep/org.argeo.suite.dep.e4.rap/p2.inf [deleted file]
dep/org.argeo.suite.dep.e4.rap/pom.xml [deleted file]
dep/org.argeo.suite.dep.e4.rcp/.gitignore [deleted file]
dep/org.argeo.suite.dep.e4.rcp/META-INF/.gitignore [deleted file]
dep/org.argeo.suite.dep.e4.rcp/bnd.bnd [deleted file]
dep/org.argeo.suite.dep.e4.rcp/p2.inf [deleted file]
dep/org.argeo.suite.dep.e4.rcp/pom.xml [deleted file]
dep/org.argeo.suite.dep.ui.rap/.gitignore [deleted file]
dep/org.argeo.suite.dep.ui.rap/META-INF/.gitignore [deleted file]
dep/org.argeo.suite.dep.ui.rap/bnd.bnd [deleted file]
dep/org.argeo.suite.dep.ui.rap/p2.inf [deleted file]
dep/org.argeo.suite.dep.ui.rap/pom.xml [deleted file]
dep/pom.xml [deleted file]
dist/.gitignore [deleted file]
dist/argeo-suite-standard/.gitignore [deleted file]
dist/argeo-suite-standard/pom.xml [deleted file]
dist/argeo-suite-standard/rpm/etc/argeo.d/suite/config.ini [deleted file]
dist/argeo-suite-standard/rpm/etc/argeo.d/suite/init/node/dc=example,dc=com.ldif [deleted file]
dist/argeo-suite-standard/rpm/etc/argeo.d/suite/init/node/ou=roles,ou=node.ldif [deleted file]
dist/argeo-suite-standard/rpm/etc/argeo.d/suite/jvm.args [deleted file]
dist/argeo-suite-standard/rpm/etc/argeo.d/suite/log4j.properties [deleted file]
dist/argeo-suite-standard/rpm/etc/systemd/system/argeo@suite.service.d/user.conf [deleted file]
dist/pom.xml [deleted file]
environment/.gitignore [deleted file]
environment/org.argeo.geo.ui/.classpath [deleted file]
environment/org.argeo.geo.ui/.gitignore [deleted file]
environment/org.argeo.geo.ui/.project [deleted file]
environment/org.argeo.geo.ui/META-INF/.gitignore [deleted file]
environment/org.argeo.geo.ui/OSGI-INF/l10n/bundle.properties [deleted file]
environment/org.argeo.geo.ui/OSGI-INF/mapLayer.xml [deleted file]
environment/org.argeo.geo.ui/OSGI-INF/overviewMap.xml [deleted file]
environment/org.argeo.geo.ui/bnd.bnd [deleted file]
environment/org.argeo.geo.ui/build.properties [deleted file]
environment/org.argeo.geo.ui/config/mapLayer.properties [deleted file]
environment/org.argeo.geo.ui/config/overviewMap.properties [deleted file]
environment/org.argeo.geo.ui/pom.xml [deleted file]
environment/org.argeo.geo.ui/src/org/argeo/geo/GeoToSvg.java [deleted file]
environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java [deleted file]
environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OverviewMap.java [deleted file]
environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/map-osm.html [deleted file]
environment/pom.xml [deleted file]
js/.externalToolBuilders/npm run build.launch [new file with mode: 0644]
js/.gitignore [new file with mode: 0644]
js/.project [new file with mode: 0644]
js/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
js/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
js/Makefile [new file with mode: 0644]
js/org.argeo.app.js/.gitignore [new file with mode: 0644]
js/org.argeo.app.js/.project [new file with mode: 0644]
js/org.argeo.app.js/bnd.bnd [new file with mode: 0644]
js/org.argeo.app.js/build.properties [new file with mode: 0644]
js/package-lock.json [new file with mode: 0644]
js/package.json [new file with mode: 0644]
js/src/chart/BarChart.js [new file with mode: 0644]
js/src/chart/ChartJsPart.js [new file with mode: 0644]
js/src/chart/ChartPart.js [new file with mode: 0644]
js/src/chart/TestGraph.js [new file with mode: 0644]
js/src/chart/export-package.js [new file with mode: 0644]
js/src/chart/index.html [new file with mode: 0644]
js/src/chart/index.js [new file with mode: 0644]
js/src/geo/BboxVectorSource.js [new file with mode: 0644]
js/src/geo/MapPart.js [new file with mode: 0644]
js/src/geo/OpenLayersMapPart.js [new file with mode: 0644]
js/src/geo/OpenLayersUtils.js [new file with mode: 0644]
js/src/geo/SentinelCloudless.js [new file with mode: 0644]
js/src/geo/export-package.js [new file with mode: 0644]
js/src/geo/index.html [new file with mode: 0644]
js/src/geo/index.js [new file with mode: 0644]
js/webpack.common.js [new file with mode: 0644]
js/webpack.dev.js [new file with mode: 0644]
js/webpack.prod.js [new file with mode: 0644]
knowledge/.gitignore [deleted file]
knowledge/org.argeo.support.geonames/.classpath [deleted file]
knowledge/org.argeo.support.geonames/.gitignore [deleted file]
knowledge/org.argeo.support.geonames/.project [deleted file]
knowledge/org.argeo.support.geonames/META-INF/.gitignore [deleted file]
knowledge/org.argeo.support.geonames/bnd.bnd [deleted file]
knowledge/org.argeo.support.geonames/build.properties [deleted file]
knowledge/org.argeo.support.geonames/pom.xml [deleted file]
knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java [deleted file]
knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/ImportGeonamesAdmin.java [deleted file]
knowledge/org.argeo.support.odk/.classpath [deleted file]
knowledge/org.argeo.support.odk/.gitignore [deleted file]
knowledge/org.argeo.support.odk/.project [deleted file]
knowledge/org.argeo.support.odk/META-INF/.gitignore [deleted file]
knowledge/org.argeo.support.odk/OSGI-INF/odkFormListServlet.xml [deleted file]
knowledge/org.argeo.support.odk/OSGI-INF/odkFormServlet.xml [deleted file]
knowledge/org.argeo.support.odk/OSGI-INF/odkManifestServlet.xml [deleted file]
knowledge/org.argeo.support.odk/OSGI-INF/odkServletContext.xml [deleted file]
knowledge/org.argeo.support.odk/OSGI-INF/odkSubmissionServlet.xml [deleted file]
knowledge/org.argeo.support.odk/bnd.bnd [deleted file]
knowledge/org.argeo.support.odk/build.properties [deleted file]
knowledge/org.argeo.support.odk/pom.xml [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/BundleResourceOdkForm.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkForm.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkNames.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkUtils.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxListName.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxManifestName.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxType.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/odk.cnd [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormListServlet.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormServlet.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkServletContext.java [deleted file]
knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkSubmissionServlet.java [deleted file]
knowledge/org.argeo.support.xforms/.classpath [deleted file]
knowledge/org.argeo.support.xforms/.gitignore [deleted file]
knowledge/org.argeo.support.xforms/.project [deleted file]
knowledge/org.argeo.support.xforms/META-INF/.gitignore [deleted file]
knowledge/org.argeo.support.xforms/bnd.bnd [deleted file]
knowledge/org.argeo.support.xforms/build.properties [deleted file]
knowledge/org.argeo.support.xforms/pom.xml [deleted file]
knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/FormSubmissionListener.java [deleted file]
knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/xforms.cnd [deleted file]
knowledge/org.argeo.support.xforms/xsd/XForms-Schema.xsd [deleted file]
knowledge/pom.xml [deleted file]
lib/.gitignore [deleted file]
lib/pom.xml [deleted file]
library/.gitignore [deleted file]
library/org.argeo.library.ui/.classpath [deleted file]
library/org.argeo.library.ui/.gitignore [deleted file]
library/org.argeo.library.ui/.project [deleted file]
library/org.argeo.library.ui/META-INF/.gitignore [deleted file]
library/org.argeo.library.ui/OSGI-INF/contentEntryArea.xml [deleted file]
library/org.argeo.library.ui/OSGI-INF/contentLayer.xml [deleted file]
library/org.argeo.library.ui/OSGI-INF/documentsFolder.xml [deleted file]
library/org.argeo.library.ui/OSGI-INF/fsEntryArea.xml [deleted file]
library/org.argeo.library.ui/OSGI-INF/l10n/bundle.properties [deleted file]
library/org.argeo.library.ui/bnd.bnd [deleted file]
library/org.argeo.library.ui/build.properties [deleted file]
library/org.argeo.library.ui/config/contentEntryArea.properties [deleted file]
library/org.argeo.library.ui/config/contentLayer.properties [deleted file]
library/org.argeo.library.ui/config/documentsFolder.properties [deleted file]
library/org.argeo.library.ui/config/fsEntryArea.properties [deleted file]
library/org.argeo.library.ui/pom.xml [deleted file]
library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java [deleted file]
library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsContextMenu.java [deleted file]
library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFileComposite.java [deleted file]
library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFolderComposite.java [deleted file]
library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFolderUiProvider.java [deleted file]
library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsTreeUiProvider.java [deleted file]
library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsUiService.java [deleted file]
library/pom.xml [deleted file]
org.argeo.api.app/.classpath [new file with mode: 0644]
org.argeo.api.app/.gitignore [new file with mode: 0644]
org.argeo.api.app/.project [new file with mode: 0644]
org.argeo.api.app/META-INF/.gitignore [new file with mode: 0644]
org.argeo.api.app/bnd.bnd [new file with mode: 0644]
org.argeo.api.app/build.properties [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/AppUserState.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/EntityConstants.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/EntityDefinition.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/EntityMimeType.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/EntityName.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/EntityNames.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/EntityType.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/IdRange.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/RankedObject.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/SuiteRole.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/Term.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/TermsManager.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/Typology.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/WGS84PosName.java [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/entity.xsd [new file with mode: 0644]
org.argeo.api.app/src/org/argeo/api/app/entityFeature.xsd [new file with mode: 0644]
org.argeo.app.core/.classpath [new file with mode: 0644]
org.argeo.app.core/.gitignore [new file with mode: 0644]
org.argeo.app.core/.project [new file with mode: 0644]
org.argeo.app.core/META-INF/.gitignore [new file with mode: 0644]
org.argeo.app.core/OSGI-INF/l10n/bundle.properties [new file with mode: 0644]
org.argeo.app.core/OSGI-INF/l10n/bundle_de.properties [new file with mode: 0644]
org.argeo.app.core/OSGI-INF/l10n/bundle_fr.properties [new file with mode: 0644]
org.argeo.app.core/OSGI-INF/suiteMaintenance.xml [new file with mode: 0644]
org.argeo.app.core/OSGI-INF/termsContentProvider.xml [new file with mode: 0644]
org.argeo.app.core/bnd.bnd [new file with mode: 0644]
org.argeo.app.core/build.properties [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/acr/terms/TermContent.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/acr/terms/TermsContentProvider.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/acr/terms/TypologyContent.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/AbstractEntityDefinition.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/SuiteContentNamespace.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenance.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/XForms-11-Schema.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/XMLSchema.dtd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/XMLSchema.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/datatypes.dtd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/docbook.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/fop.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0-RFC6321.rnc [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0.rnc [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0-RFC6351.rnc [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0.rnc [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xlink.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xml-events-attribs-1.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/core/schemas/xml.xsd [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/docbook/DbkAcrUtils.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/docbook/DbkAttr.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/docbook/DbkMsg.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/docbook/DbkType.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/image/ImageProcessor.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/library/DocxExtractor.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/odk/OdkNames.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/odk/OrxListName.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/odk/OrxManifestName.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/odk/OrxType.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/AbstractArgeoApp.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/AppUi.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteIcon.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteMsg.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteStyle.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/SuiteUxEvent.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/js/AbstractJsObject.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/js/JsClient.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/ux/js/JsReference.java [new file with mode: 0644]
org.argeo.app.core/src/org/argeo/app/xforms/FormSubmissionListener.java [new file with mode: 0644]
org.argeo.app.geo/.classpath [new file with mode: 0644]
org.argeo.app.geo/.project [new file with mode: 0644]
org.argeo.app.geo/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
org.argeo.app.geo/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
org.argeo.app.geo/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
org.argeo.app.geo/OSGI-INF/wfsHttpHandler.xml [new file with mode: 0644]
org.argeo.app.geo/bnd.bnd [new file with mode: 0644]
org.argeo.app.geo/build.properties [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/api/app/geo/FeatureAdapter.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/api/app/geo/WfsKvp.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/CqlUtils.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GeoJson.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GeoJsonUtils.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GeoShapeUtils.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GeoToSvg.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GeoTools.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GeoToolsTest.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GeoUtils.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GmlAttr.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GmlType.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/GpxUtils.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/JTS.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/acr/AbstractFeatureAdapter.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/acr/GeoEntityUtils.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/geonames/GeonamesAdm.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/geonames/ImportGeonamesAdmin.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/http/WfsHttpHandler.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/http/WfsUtils.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/ux/AbstractGeoJsObject.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/ux/BboxVectorSource.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/ux/OpenLayersMapPart.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/geo/ux/SentinelCloudless.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/AbstractOlObject.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/FeatureFormat.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/GeoJSON.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/Layer.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/OSM.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/OlMap.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/Source.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/TileLayer.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/VectorLayer.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/VectorSource.java [new file with mode: 0644]
org.argeo.app.geo/src/org/argeo/app/ol/View.java [new file with mode: 0644]
org.argeo.app.jcr/.classpath [new file with mode: 0644]
org.argeo.app.jcr/.project [new file with mode: 0644]
org.argeo.app.jcr/OSGI-INF/appUserState.xml [new file with mode: 0644]
org.argeo.app.jcr/OSGI-INF/maintenanceService.xml [new file with mode: 0644]
org.argeo.app.jcr/OSGI-INF/termsManager.xml [new file with mode: 0644]
org.argeo.app.jcr/bnd.bnd [new file with mode: 0644]
org.argeo.app.jcr/build.properties [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/CustomMaintenanceService.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/JcrEntityDefinition.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/XPathUtils.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/Dbk4Converter.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/DbkJcrUtils.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/db4-upgrade.xsl [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/docbook-full.cnd [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/docbook.cnd [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/entity.cnd [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/odk/OdkJcrUtils.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/odk/odk.cnd [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTerm.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTermsManager.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTypology.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/xforms/XFormsJcrUtils.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/app/jcr/xforms/xforms.cnd [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java [new file with mode: 0644]
org.argeo.app.jcr/src/org/argeo/internal/app/jcr/SuiteMaintenanceService.java [new file with mode: 0644]
org.argeo.app.profile.acr.fs/.classpath [new file with mode: 0644]
org.argeo.app.profile.acr.fs/.project [new file with mode: 0644]
org.argeo.app.profile.acr.fs/OSGI-INF/srvContentProvider.xml [new file with mode: 0644]
org.argeo.app.profile.acr.fs/OSGI-INF/sysContentProvider.xml [new file with mode: 0644]
org.argeo.app.profile.acr.fs/bnd.bnd [new file with mode: 0644]
org.argeo.app.profile.acr.fs/build.properties [new file with mode: 0644]
org.argeo.app.profile.acr.fs/src/.gitignore [new file with mode: 0644]
org.argeo.app.profile.acr.jcr/.classpath [new file with mode: 0644]
org.argeo.app.profile.acr.jcr/.project [new file with mode: 0644]
org.argeo.app.profile.acr.jcr/OSGI-INF/srvContentProvider.xml [new file with mode: 0644]
org.argeo.app.profile.acr.jcr/OSGI-INF/sysContentProvider.xml [new file with mode: 0644]
org.argeo.app.profile.acr.jcr/bnd.bnd [new file with mode: 0644]
org.argeo.app.profile.acr.jcr/build.properties [new file with mode: 0644]
org.argeo.app.profile.acr.jcr/src/.gitignore [new file with mode: 0644]
org.argeo.app.servlet.odk/.classpath [new file with mode: 0644]
org.argeo.app.servlet.odk/.gitignore [new file with mode: 0644]
org.argeo.app.servlet.odk/.project [new file with mode: 0644]
org.argeo.app.servlet.odk/META-INF/.gitignore [new file with mode: 0644]
org.argeo.app.servlet.odk/OSGI-INF/odkFormListServlet.xml [new file with mode: 0644]
org.argeo.app.servlet.odk/OSGI-INF/odkFormServlet.xml [new file with mode: 0644]
org.argeo.app.servlet.odk/OSGI-INF/odkManifestServlet.xml [new file with mode: 0644]
org.argeo.app.servlet.odk/OSGI-INF/odkServletContext.xml [new file with mode: 0644]
org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml [new file with mode: 0644]
org.argeo.app.servlet.odk/bnd.bnd [new file with mode: 0644]
org.argeo.app.servlet.odk/build.properties [new file with mode: 0644]
org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormListServlet.java [new file with mode: 0644]
org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormServlet.java [new file with mode: 0644]
org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkManifestServlet.java [new file with mode: 0644]
org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkServletContext.java [new file with mode: 0644]
org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java [new file with mode: 0644]
org.argeo.app.servlet.publish/.classpath [new file with mode: 0644]
org.argeo.app.servlet.publish/.gitignore [new file with mode: 0644]
org.argeo.app.servlet.publish/.project [new file with mode: 0644]
org.argeo.app.servlet.publish/META-INF/.gitignore [new file with mode: 0644]
org.argeo.app.servlet.publish/OSGI-INF/dbkServlet.xml [new file with mode: 0644]
org.argeo.app.servlet.publish/OSGI-INF/fontsServlet.xml [new file with mode: 0644]
org.argeo.app.servlet.publish/OSGI-INF/htmlServletContext.xml [new file with mode: 0644]
org.argeo.app.servlet.publish/OSGI-INF/l10n/bundle.properties [new file with mode: 0644]
org.argeo.app.servlet.publish/bnd.bnd [new file with mode: 0644]
org.argeo.app.servlet.publish/build.properties [new file with mode: 0644]
org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java [new file with mode: 0644]
org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/FontsServlet.java [new file with mode: 0644]
org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/FopServlet.java [new file with mode: 0644]
org.argeo.app.theme.default/.classpath [new file with mode: 0644]
org.argeo.app.theme.default/.gitignore [new file with mode: 0644]
org.argeo.app.theme.default/.project [new file with mode: 0644]
org.argeo.app.theme.default/META-INF/.gitignore [new file with mode: 0644]
org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml [new file with mode: 0644]
org.argeo.app.theme.default/bnd.bnd [new file with mode: 0644]
org.argeo.app.theme.default/build.properties [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/.gitignore [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/activity.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/add.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/addressBook.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/ascending.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/calendar.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/close.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/closeAll.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/dashboard.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/delete.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/descending.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/document.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/documents.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/email.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/fav.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/favNot.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/folder.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/group.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/historyAscending.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/historyDescending.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/home.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/inbox.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/license.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/location.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/logout.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/map.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/milestone.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/mobile.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/note.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/openUserMenu.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/organisation.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/organisationContact.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/people.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/person.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/project-01.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/refresh.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/report.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/save.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/saveAll.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/search.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/settings.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/tag.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/task.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/task_1.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/telephone.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/timeLine.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/todo.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/user.svg [new file with mode: 0644]
org.argeo.app.theme.default/icons/types/svg/users.svg [new file with mode: 0644]
org.argeo.app.theme.default/rap/argeo.css [new file with mode: 0644]
org.argeo.app.theme.default/rap/defaults.css [new file with mode: 0644]
org.argeo.app.theme.default/src/.gitignore [new file with mode: 0644]
org.argeo.app.theme.default/swt/app.css [new file with mode: 0644]
org.argeo.suite.knowledge/.classpath [new file with mode: 0644]
org.argeo.suite.knowledge/.project [new file with mode: 0644]
org.argeo.suite.knowledge/OSGI-INF/l10n/bundle.properties [new file with mode: 0644]
org.argeo.suite.knowledge/OSGI-INF/leadPane.xml [new file with mode: 0644]
org.argeo.suite.knowledge/OSGI-INF/spaceEntryArea.xml [new file with mode: 0644]
org.argeo.suite.knowledge/OSGI-INF/structureLayer.xml [new file with mode: 0644]
org.argeo.suite.knowledge/OSGI-INF/swtArgeoApp.xml [new file with mode: 0644]
org.argeo.suite.knowledge/OSGI-INF/termsEntryArea.xml [new file with mode: 0644]
org.argeo.suite.knowledge/OSGI-INF/termsLayer.xml [new file with mode: 0644]
org.argeo.suite.knowledge/bnd.bnd [new file with mode: 0644]
org.argeo.suite.knowledge/build.properties [new file with mode: 0644]
org.argeo.suite.knowledge/config/leadPane.properties [new file with mode: 0644]
org.argeo.suite.knowledge/config/spaceEntryArea.properties [new file with mode: 0644]
org.argeo.suite.knowledge/config/structureLayer.properties [new file with mode: 0644]
org.argeo.suite.knowledge/config/swtArgeoApp.properties [new file with mode: 0644]
org.argeo.suite.knowledge/config/termsEntryArea.properties [new file with mode: 0644]
org.argeo.suite.knowledge/config/termsLayer.properties [new file with mode: 0644]
org.argeo.suite.knowledge/src/.gitignore [new file with mode: 0644]
people/.gitignore [deleted file]
people/org.argeo.people.ui/.classpath [deleted file]
people/org.argeo.people.ui/.gitignore [deleted file]
people/org.argeo.people.ui/.project [deleted file]
people/org.argeo.people.ui/META-INF/.gitignore [deleted file]
people/org.argeo.people.ui/OSGI-INF/l10n/bundle.properties [deleted file]
people/org.argeo.people.ui/OSGI-INF/peopleEntryArea.xml [deleted file]
people/org.argeo.people.ui/OSGI-INF/peopleLayer.xml [deleted file]
people/org.argeo.people.ui/OSGI-INF/personUiProvider.xml [deleted file]
people/org.argeo.people.ui/bnd.bnd [deleted file]
people/org.argeo.people.ui/build.properties [deleted file]
people/org.argeo.people.ui/config/peopleEntryArea.properties [deleted file]
people/org.argeo.people.ui/config/peopleLayer.properties [deleted file]
people/org.argeo.people.ui/config/personUiProvider.properties [deleted file]
people/org.argeo.people.ui/pom.xml [deleted file]
people/org.argeo.people.ui/src/org/argeo/people/ui/PeopleEntryArea.java [deleted file]
people/org.argeo.people.ui/src/org/argeo/people/ui/PersonUiProvider.java [deleted file]
people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java [deleted file]
people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java [deleted file]
people/pom.xml [deleted file]
pom.xml [deleted file]
publishing/.gitignore [deleted file]
publishing/org.argeo.publishing.ui/.classpath [deleted file]
publishing/org.argeo.publishing.ui/.gitignore [deleted file]
publishing/org.argeo.publishing.ui/.project [deleted file]
publishing/org.argeo.publishing.ui/META-INF/.gitignore [deleted file]
publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml [deleted file]
publishing/org.argeo.publishing.ui/OSGI-INF/documentUiProvider.xml [deleted file]
publishing/org.argeo.publishing.ui/OSGI-INF/fontsServlet.xml [deleted file]
publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml [deleted file]
publishing/org.argeo.publishing.ui/OSGI-INF/l10n/bundle.properties [deleted file]
publishing/org.argeo.publishing.ui/bnd.bnd [deleted file]
publishing/org.argeo.publishing.ui/build.properties [deleted file]
publishing/org.argeo.publishing.ui/config/documentUiProvider.properties [deleted file]
publishing/org.argeo.publishing.ui/pom.xml [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/AbstractTextViewer.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsNames.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsTextImageManager.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsTypes.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CustomTextEditor.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/IdentityTextInterpreter.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/MarkupValidatorCopy.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/Paragraph.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/SectionTitle.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/StandardTextEditor.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextContextMenu.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextEditorHeader.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextInterpreter.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextInterpreterImpl.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextSection.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/WikiPage.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkAttr.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkMsg.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkUtils.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/docbook-full.cnd [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/docbook.cnd [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/CustomDbkEditor.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImg.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkTextInterpreter.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocBookSectionTitle.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocumentPage.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocumentTextEditor.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/FontsServlet.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/PublishingApp.java [deleted file]
publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/PublishingStyle.java [deleted file]
publishing/pom.xml [deleted file]
sdk/argeo-build [new submodule]
sdk/argeo-office-e4-rap.properties [deleted file]
sdk/argeo-suite-desktop.properties
sdk/argeo-suite-rap.properties [deleted file]
sdk/argeo-suite-rcp.properties [deleted file]
sdk/argeo-suite-server.properties [new file with mode: 0644]
sdk/argeo-wm.properties [deleted file]
sdk/branches/testing.bnd [new file with mode: 0644]
sdk/branches/unstable.bnd [new file with mode: 0644]
sdk/deploy/.gitignore [new file with mode: 0644]
sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/config.ini [new file with mode: 0644]
sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/jvm.args [new file with mode: 0644]
sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/system.properties [new file with mode: 0644]
sdk/deploy/argeo-desktop/usr/share/applications/argeo.desktop [new file with mode: 0644]
sdk/deploy/argeo-server/etc/argeo.d/server/config.ini [new file with mode: 0644]
sdk/deploy/argeo-server/etc/argeo.d/server/jvm.args [new file with mode: 0644]
sdk/deploy/argeo-server/etc/argeo.d/server/system.properties [new file with mode: 0644]
sdk/init/node/dc=example,dc=com.ldif [deleted file]
sdk/init/node/ou=roles,ou=node.ldif [deleted file]
sdk/init/private/dc=example,dc=com.ldif [new file with mode: 0644]
sdk/init/private/ou=roles,ou=node.ldif [new file with mode: 0644]
sdk/log4j.properties [deleted file]
sdk/output-cms-rap.target [new file with mode: 0644]
sdk/output-cms-rcp.target [new file with mode: 0644]
sdk/output-suite-rcp.target [new file with mode: 0644]
swt/org.argeo.app.geo.swt/.classpath [new file with mode: 0644]
swt/org.argeo.app.geo.swt/.project [new file with mode: 0644]
swt/org.argeo.app.geo.swt/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
swt/org.argeo.app.geo.swt/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
swt/org.argeo.app.geo.swt/.settings/org.eclipse.pde.core.prefs [new file with mode: 0644]
swt/org.argeo.app.geo.swt/bnd.bnd [new file with mode: 0644]
swt/org.argeo.app.geo.swt/build.properties [new file with mode: 0644]
swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.swt/.classpath [new file with mode: 0644]
swt/org.argeo.app.swt/.project [new file with mode: 0644]
swt/org.argeo.app.swt/bnd.bnd [new file with mode: 0644]
swt/org.argeo.app.swt/build.properties [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/chart/AbstractJsChart.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/chart/SwtJsBarChart.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkImageManager.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkImg.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkSectionTitle.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkTextInterpreter.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkVideo.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DocBookViewer.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/Paragraph.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextInterpreter.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextSection.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditableLink.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditableMultiStringProperty.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditablePropertyDate.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditablePropertyString.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormConstants.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormPageViewer.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormStyle.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormUtils.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/js/SwtBrowserJsPart.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/osgi/BundleSvgTheme.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/osgi/SvgToPng.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/space/SpaceEntryArea.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/AbstractTermsPart.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/MultiTermsPart.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/SingleTermPart.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/TermsEntryArea.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultEditionLayer.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultFooter.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultHeader.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultLeadPane.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultLoginScreen.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SuiteSwtUtils.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppLayer.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppUi.java [new file with mode: 0644]
swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java [new file with mode: 0644]
swt/org.argeo.app.ui/.classpath [new file with mode: 0644]
swt/org.argeo.app.ui/.gitignore [new file with mode: 0644]
swt/org.argeo.app.ui/.project [new file with mode: 0644]
swt/org.argeo.app.ui/META-INF/.gitignore [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/adminLeadPane.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/contentLayer.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/dashboard.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/defaultMap.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/documentUiProvider.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/documentsFolder.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/eventRecorder.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/footer.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/fsEntryArea.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/groupUiProvider.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/header.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/hierarchyUnitUiProvider.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/leadPane.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/loginScreen.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/mapLayer.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/peopleEntryArea.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/peopleLayer.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/personUiProvider.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/publishUiProvider.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/recentItems.xml [new file with mode: 0644]
swt/org.argeo.app.ui/OSGI-INF/wwwLayer.xml [new file with mode: 0644]
swt/org.argeo.app.ui/bnd.bnd [new file with mode: 0644]
swt/org.argeo.app.ui/build.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/adminLeadPane.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/cmsApp.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/contentEntryArea.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/contentLayer.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/dashboard.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/dashboardLayer.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/defaultMap.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/documentUiProvider.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/documentsFolder.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/eventRecorder.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/footer.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/fsEntryArea.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/groupUiProvider.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/header.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/hierarchyUnitUiProvider.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/leadPane.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/loginScreen.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/mapLayer.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/overviewMap.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/peopleEntryArea.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/peopleLayer.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/personUiProvider.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/publishEntryArea.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/publishUiProvider.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/recentItems.properties [new file with mode: 0644]
swt/org.argeo.app.ui/config/wwwLayer.properties [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/jface/JFaceUtils.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultDashboard.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/EventRecorder.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonPage.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonWizard.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/AbstractDbkViewer.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/CustomDbkEditor.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkContextMenu.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImageManager.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImg.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkSectionTitle.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkTextInterpreter.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkVideo.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentPage.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentTextEditor.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/Paragraph.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextEditorHeader.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextInterpreter.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextSection.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/AbstractTermsPart.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/MultiTermsPart.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/SingleTermPart.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsContextMenu.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFileComposite.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFolderComposite.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFolderUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsTreeUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsUiService.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OpenLayersMap.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OverviewMap.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/map-osm.html [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/map.js [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/ChooseUserDialog.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/HierarchyUnitPart.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/HierarchyUnitUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UserColumn.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UsersPart.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/people/vcard/VCardExporter.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/DocumentUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PdfViewer.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishingApp.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishingStyle.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/AbstractConnectContextMenu.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/ConnectAbstractDropDown.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/DelayedText.java [new file with mode: 0644]
swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/TreeOrSearchArea.java [new file with mode: 0644]

index e3d2422940bbb14f159d0eba593d3543511bf54f..305a343d92faf5d7873d09eb5c80f7226f072372 100644 (file)
@@ -1,2 +1,8 @@
-/target/
-/.DS_Store
+**/bin/
+**/target/
+**/generated/
+**/MANIFEST.MF
+**/.DS_Store
+/sdk.mk
+/output/
+**/node_modules
diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..d728334
--- /dev/null
@@ -0,0 +1,4 @@
+[submodule "sdk/argeo-build"]
+       path = sdk/argeo-build
+       url = http://git.argeo.org/cc0/argeo-build.git
+       branch = testing
index ff418936f2de03c4250f3d5a808862b33bc3faf5..4106bf47e4b1a1afb0ce94cd9d171d7a07467204 100644 (file)
--- a/.project
+++ b/.project
@@ -5,6 +5,11 @@
        <projects>
        </projects>
        <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
        </buildSpec>
        <natures>
        </natures>
diff --git a/COPYING b/COPYING
index f288702d2fa16d3cdf0035b15a9fcbc552cd88e7..d159169d1050894d3ea3b98e1c965c4058208fe1 100644 (file)
--- a/COPYING
+++ b/COPYING
                     GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
+                       Version 2, June 1991
 
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ 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 GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
+  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
-them 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.
+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 prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
+  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 pass on to the recipients the same
-freedoms that you received.  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.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
+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.
 
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey 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;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
+                    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.
 
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
+  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 convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
+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 that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  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.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-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.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
+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
 
@@ -628,15 +287,15 @@ 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
-state the exclusion of warranty; and each file should have at least
+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
+    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 3 of the License, or
+    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,
@@ -644,31 +303,37 @@ the "copyright" line and a pointer to where the full notice is found.
     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/>.
+    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 does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
 
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    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, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<https://www.gnu.org/licenses/>.
-
-  The GNU 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.  But first, please read
-<https://www.gnu.org/licenses/why-not-lgpl.html>.
+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/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..134414d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,59 @@
+include sdk.mk
+.PHONY: clean all osgi web
+
+all: web osgi
+       
+install: osgi-install
+
+uninstall: osgi-uninstall
+
+A2_CATEGORY = org.argeo.suite
+
+BUNDLES = \
+org.argeo.api.app \
+org.argeo.app.core \
+org.argeo.app.jcr \
+org.argeo.app.geo \
+org.argeo.app.servlet.odk \
+org.argeo.app.servlet.publish \
+org.argeo.app.theme.default \
+org.argeo.app.profile.acr.fs \
+org.argeo.app.profile.acr.jcr \
+org.argeo.suite.knowledge \
+swt/org.argeo.app.swt \
+swt/org.argeo.app.geo.swt \
+swt/org.argeo.app.ui \
+
+DEP_CATEGORIES = \
+org.argeo.tp \
+org.argeo.tp.httpd \
+org.argeo.tp.sys \
+org.argeo.tp.sdk \
+org.argeo.tp.jcr \
+org.argeo.tp.utils \
+org.argeo.tp.img \
+org.argeo.tp.publish \
+org.argeo.tp.math \
+org.argeo.tp.earth \
+osgi/equinox/org.argeo.tp.osgi \
+osgi/equinox/org.argeo.tp.eclipse \
+swt/rap/org.argeo.tp.swt \
+swt/rap/org.argeo.tp.swt.workbench \
+org.argeo.cms \
+org.argeo.cms.jcr \
+swt/org.argeo.cms \
+swt/org.argeo.cms.jcr \
+swt/rap/org.argeo.cms \
+
+clean:
+       rm -rf $(BUILD_BASE)
+       make -C js clean
+
+native-deps-debian:
+       sudo apt install npm
+
+## WEB
+web:
+       make -C js all
+
+include  $(SDK_SRC_BASE)/sdk/argeo-build/osgi.mk
diff --git a/NOTICE b/NOTICE
new file mode 100644 (file)
index 0000000..de09206
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,84 @@
+Argeo Suite - Applications based on Argeo Commons
+
+Copyright 2014-2023 Argeo GmbH
+Copyright 2017-2023 Mathieu Baudier
+
+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, see <https://www.gnu.org/licenses>.
+
+## Additional Permissions
+
+# Eclipse Public License Permission
+
+Linking Argeo Suite statically or dynamically with other modules is making a 
+combined work based on Argeo Suite. Thus, the terms and conditions of the GNU 
+General Public License cover the whole combination.
+
+In addition, as a special exception, the copyright holders of Argeo Suite give 
+you permission to combine Argeo Suite with any program released under the 
+terms and conditions of the Eclipse Public License v1.0, v2.0 (even without a 
+Secondary License enabled) or any later version of this license. You may copy 
+and distribute such a system following the terms of the GNU GPL for Argeo Suite 
+and the licenses of the other code concerned, provided that you include the 
+source code of that other code when and as the GNU GPL requires distribution of 
+source code.
+
+Note that people who make modified versions of Argeo Suite are not obligated 
+to grant this special exception for their modified versions; it is their choice 
+whether to do so. The GNU General Public License gives permission to release a 
+modified version without this exception; this exception also makes it possible 
+to release a modified version which carries forward this exception.
+
+# Apache License Permission
+
+Linking Argeo Suite statically or dynamically with other modules is making a 
+combined work based on Argeo Suite. Thus, the terms and conditions of the GNU 
+General Public License cover the whole combination when this license becomes 
+applicable.
+
+In addition, as a special exception, the copyright holders of Argeo Suite give 
+you permission to combine Argeo Suite with any program released under the 
+terms and conditions of the Apache License v2.0 or any later version of this 
+license. You may copy and distribute such a system following the terms of 
+the GNU GPL for Argeo Suite and the licenses of the other code concerned, 
+provided that you include the source code of that other code when and as 
+the GNU GPL requires distribution of source code.
+
+Note that people who make modified versions of Argeo Suite are not obligated 
+to grant this special exception for their modified versions; it is their choice 
+whether to do so. The GNU General Public License gives permission to release a 
+modified version without this exception; this exception also makes it possible 
+to release a modified version which carries forward this exception.
+
+# Java Content Repository API version 2.0 Permission
+
+Linking Argeo Suite statically or dynamically with other modules is making a 
+combined work based on Argeo Suite. Thus, the terms and conditions of the GNU 
+General Public License cover the whole combination.
+
+In addition, as a special exception, the copyright holders of Argeo Suite give 
+you permission to combine Argeo Suite with code included in the standard 
+release of the JCR API version 2.0 (and this version only), licensed under the 
+Day Specification License and the Day JCR License. You may copy and distribute 
+such a system following the terms of the GNU GPL for Argeo Suite and the 
+licenses of the other code concerned.
+
+Copies of the Day Specification License and the Day JCR License 
+are expected to be available here:
+https://jackrabbit.apache.org/jcr/jcr.html
+
+Note that people who make modified versions of Argeo Suite are not obligated 
+to grant this special exception for their modified versions; it is their choice 
+whether to do so. The GNU General Public License gives permission to release a 
+modified version without this exception; this exception also makes it possible 
+to release a modified version which carries forward this exception.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..40fb60c
--- /dev/null
+++ b/README
@@ -0,0 +1,21 @@
+Argeo Suite provides components and APIs to build productivity or reporting appalications.
+
+## Build
+Prerequisites to build this layer:
+- build Argeo TP
+- build Argeo Commons
+- build Argeo JCR
+(cf. http://git.argeo.org)
+
+Then, run:
+
+git clone http://git.argeo.org/gpl/argeo-suite.git --recursive
+export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
+./argeo-suite/configure
+
+cd argeo-suite
+make clean all
+
+In order to use it within an Eclipse PDE environment:
+
+make clean all manifests
\ No newline at end of file
diff --git a/branch.mk b/branch.mk
new file mode 100644 (file)
index 0000000..dbecaaa
--- /dev/null
+++ b/branch.mk
@@ -0,0 +1 @@
+BRANCH=testing
\ No newline at end of file
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..9f49215
--- /dev/null
+++ b/configure
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Source are located where this script is
+SDK_SRC_BASE="$(cd "$(dirname "$0")"; pwd -P)"
+
+# Source the configure script
+. $SDK_SRC_BASE/sdk/argeo-build/configure
\ No newline at end of file
diff --git a/core/.gitignore b/core/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/core/org.argeo.entity.api/.classpath b/core/org.argeo.entity.api/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.argeo.entity.api/.gitignore b/core/org.argeo.entity.api/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/core/org.argeo.entity.api/.project b/core/org.argeo.entity.api/.project
deleted file mode 100644 (file)
index 1269cce..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.entity.api</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/core/org.argeo.entity.api/META-INF/.gitignore b/core/org.argeo.entity.api/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/core/org.argeo.entity.api/bnd.bnd b/core/org.argeo.entity.api/bnd.bnd
deleted file mode 100644 (file)
index ab46172..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-Require-Capability:\
-cms.datamodel;filter:="(name=jcrx)"
-
-Provide-Capability:\
-cms.datamodel; name=entity; cnd=/org/argeo/entity/entity.cnd
diff --git a/core/org.argeo.entity.api/build.properties b/core/org.argeo.entity.api/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/core/org.argeo.entity.api/pom.xml b/core/org.argeo.entity.api/pom.xml
deleted file mode 100644 (file)
index c0723fe..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>core</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.entity.api</artifactId>
-       <name>Entity API</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <!-- Argeo Commons -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.enterprise</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/EntityConstants.java b/core/org.argeo.entity.api/src/org/argeo/entity/EntityConstants.java
deleted file mode 100644 (file)
index f7a2de8..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.argeo.entity;
-
-/** Constant related to entities, typically used in an OSGi context. */
-public interface EntityConstants {
-       final static String TYPE = "entity.type";
-       final static String DEFAULT_EDITORY_ID = "entity.defaultEditorId";
-
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/EntityDefinition.java b/core/org.argeo.entity.api/src/org/argeo/entity/EntityDefinition.java
deleted file mode 100644 (file)
index 08aff61..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.argeo.entity;
-
-import javax.jcr.Node;
-
-/** The definition of an entity, a composite configurable data structure. */
-public interface EntityDefinition {
-       String getEditorId(Node entity);
-
-       String getType();
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/EntityNames.java b/core/org.argeo.entity.api/src/org/argeo/entity/EntityNames.java
deleted file mode 100644 (file)
index ede7447..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.argeo.entity;
-
-import org.argeo.naming.LdapAttrs;
-
-/** Constants used to name entity structures. */
-public interface EntityNames {
-       @Deprecated
-       final String FORM_BASE = "form";
-       final String SUBMISSIONS_BASE = "submissions";
-       @Deprecated
-       final String TERM = "term";
-       final String NAME = "name";
-
-//     final String ENTITY_DEFINITIONS_PATH = "/entity";
-       @Deprecated
-       final String TYPOLOGIES_PATH = "/" + TERM;
-       /** Administrative units. */
-       final String ADM = "adm";
-
-       final String ENTITY_TYPE = "entity:type";
-       // final String ENTITY_UID = "entity:uid";
-       // final String ENTITY_NAME = "entity:name";
-
-       // GENERIC CONCEPTS
-       /** The language which is relevant. */
-       final String XML_LANG = "xml:lang";
-       /** The date which is relevant. */
-       final String ENTITY_DATE = "entity:date";
-       @Deprecated
-       final String ENTITY_RELATED_TO = "entity:relatedTo";
-
-       // DEFAULT FOLDER NAMES
-       final String MEDIA = "media";
-       final String FILES = "files";
-
-       // LDAP-LIKE ENTITIES
-       @Deprecated
-       final String DISPLAY_NAME = LdapAttrs.displayName.property();
-       // Persons
-       @Deprecated
-       final String GIVEN_NAME = LdapAttrs.givenName.property();
-       @Deprecated
-       final String SURNAME = LdapAttrs.sn.property();
-       @Deprecated
-       final String EMAIL = LdapAttrs.mail.property();
-       @Deprecated
-       final String OU = LdapAttrs.ou.property();
-
-       // WGS84
-       final String GEO_LAT = "geo:lat";
-       final String GEO_LONG = "geo:long";
-       final String GEO_ALT = "geo:alt";
-
-       // SVG
-       final String SVG_WIDTH = "svg:width";
-       final String SVG_HEIGHT = "svg:height";
-       final String SVG_LENGTH = "svg:length";
-       final String SVG_UNIT = "svg:unit";
-       final String SVG_DUR = "svg:dur";
-       final String SVG_DIRECTION = "svg:direction";
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/EntityType.java b/core/org.argeo.entity.api/src/org/argeo/entity/EntityType.java
deleted file mode 100644 (file)
index 089cdcf..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.argeo.entity;
-
-/** Types related to entities. */
-public enum EntityType implements JcrName {
-       // entity
-       entity, local, relatedTo,
-       // structure
-       space, document,
-       // typology
-       typologies, terms, term,
-       // form
-       form, formSet, formSubmission,
-       // graphics
-       box,
-       // geography
-       geopoint, bearing,
-       // ldap
-       person, user;
-
-       @Override
-       public String getPrefix() {
-               return prefix();
-       }
-
-       public static String prefix() {
-               return "entity";
-       }
-
-       public String basePath() {
-               return '/' + name();
-       }
-
-       @Override
-       public String getNamespace() {
-               return namespace();
-       }
-
-       public static String namespace() {
-               return "http://www.argeo.org/ns/entity";
-       }
-
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/EntityTypes.java b/core/org.argeo.entity.api/src/org/argeo/entity/EntityTypes.java
deleted file mode 100644 (file)
index ef35147..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.argeo.entity;
-
-/** Types related to entities. */
-@Deprecated
-public interface EntityTypes {
-       final static String ENTITY_ENTITY = "entity:entity";
-       final static String ENTITY_DEFINITION = "entity:definition";
-
-       final static String ENTITY_PERSON = "entity:person";
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/JcrName.java b/core/org.argeo.entity.api/src/org/argeo/entity/JcrName.java
deleted file mode 100644 (file)
index 322c42e..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.argeo.entity;
-
-import java.util.function.Supplier;
-
-/** Can be applied to {@link Enum}s in order to generate prefixed names. */
-@FunctionalInterface
-public interface JcrName extends Supplier<String> {
-       String name();
-
-       default String getPrefix() {
-               return null;
-       }
-
-       default String getNamespace() {
-               return null;
-       }
-
-       @Override
-       default String get() {
-               String prefix = getPrefix();
-               return prefix != null ? prefix + ":" + name() : name();
-       }
-
-       default String withNamespace() {
-               String namespace = getNamespace();
-               if (namespace == null)
-                       throw new UnsupportedOperationException("No namespace is specified for " + getClass());
-               return "{" + namespace + "}" + name();
-       }
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/Term.java b/core/org.argeo.entity.api/src/org/argeo/entity/Term.java
deleted file mode 100644 (file)
index 3bf075a..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.argeo.entity;
-
-import java.util.List;
-
-/**
- * A name within a {@link Typology}, used to qualify an entity (categories,
- * keywords, etc.).
- */
-public interface Term {
-       String getId();
-
-       String getName();
-
-//     String getRelativePath();
-
-       Typology getTypology();
-
-       List<? extends Term> getSubTerms();
-
-       Term getParentTerm();
-
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/TermsManager.java b/core/org.argeo.entity.api/src/org/argeo/entity/TermsManager.java
deleted file mode 100644 (file)
index 7564ff9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.argeo.entity;
-
-import java.util.List;
-
-/** Provides optimised access and utilities around terms typologies. */
-public interface TermsManager {
-       Typology getTypology(String typology);
-       
-       Term getTerm(String id);
-
-       List<Term> listAllTerms(String typology);
-
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/Typology.java b/core/org.argeo.entity.api/src/org/argeo/entity/Typology.java
deleted file mode 100644 (file)
index 43431a0..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.entity;
-
-import java.util.List;
-
-/** A structured and exhaustive set of {@link Term}s. */
-public interface Typology {
-
-       String getId();
-
-       boolean isFlat();
-
-       List<? extends Term> getSubTerms();
-
-}
diff --git a/core/org.argeo.entity.api/src/org/argeo/entity/entity.cnd b/core/org.argeo.entity.api/src/org/argeo/entity/entity.cnd
deleted file mode 100644 (file)
index 151df4e..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-// Standard namespaces
-<xsd = "http://www.w3.org/2001/XMLSchema">
-<h = "http://www.w3.org/1999/xhtml">
-// see https://www.w3.org/2003/01/geo/
-<geo = "http://www.w3.org/2003/01/geo/wgs84_pos#">
-<svg = "http://www.w3.org/2000/svg">
-
-<ldap = "http://www.argeo.org/ns/ldap">
-<entity = 'http://www.argeo.org/ns/entity'>
-
-[entity:entity] > mix:created, mix:referenceable
-mixin
-
-[entity:local] > entity:entity
-mixin
-- entity:type (String) m
-
-[entity:relatedTo]
-mixin
-+ entity:relatedTo (nt:address) *
-
-//
-// ENTITY DEFINITION
-//
-//[entity:definition] > entity:composite, mix:created, mix:lastModified, mix:referenceable
-//- entity:type (String) multiple
-
-//[entity:part]
-
-//[entity:reference]
-
-//[entity:composite]
-//orderable
-//+ * (entity:part)
-//+ * (entity:reference)
-//+ * (entity:composite)
-
-//
-// STRUCTURE
-//
-[entity:space]
-mixin
-
-[entity:document]
-mixin
-
-//
-// TYPOLOGY
-//
-[entity:typologies]
-+ * (entity:terms) = entity:terms
-
-[entity:term]
-orderable
-- name (NAME)
-- * (*)
-+ term (entity:term) = entity:term *
-
-[entity:terms] > mix:referenceable
-orderable
-+ term (entity:term) = entity:term *
-
-//
-// FORM
-//
-[entity:form]
-mixin
-
-[entity:formSubmission]
-mixin
-
-[entity:formSet] > mix:title
-mixin
-
-//
-// GRAPHICS
-//
-[entity:box]
-mixin
-- svg:width (DOUBLE)
-- svg:height (DOUBLE)
-- svg:length (DOUBLE)
-- svg:unit (STRING)
-- svg:dur (DOUBLE)
-
-// LDAP-LIKE ENTITIES
-// A real person
-[entity:person] > entity:entity
-mixin
-- ldap:sn (String)
-- ldap:givenName (String)
-- ldap:mail (String) *
-
-[entity:user] > entity:person
-mixin
-- ldap:distinguishedName (String)
-- ldap:uid (String)
-
-// GEOGRAPHY
-[entity:geopoint]
-mixin
-- geo:long (DOUBLE)
-- geo:lat (DOUBLE)
-- geo:alt (DOUBLE)
-
-[entity:bearing]
-mixin
-- svg:direction (DOUBLE)
diff --git a/core/org.argeo.entity.core/.classpath b/core/org.argeo.entity.core/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.argeo.entity.core/.gitignore b/core/org.argeo.entity.core/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/core/org.argeo.entity.core/.project b/core/org.argeo.entity.core/.project
deleted file mode 100644 (file)
index 1acff84..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.entity.core</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/core/org.argeo.entity.core/META-INF/.gitignore b/core/org.argeo.entity.core/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/core/org.argeo.entity.core/bnd.bnd b/core/org.argeo.entity.core/bnd.bnd
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/core/org.argeo.entity.core/build.properties b/core/org.argeo.entity.core/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/core/org.argeo.entity.core/pom.xml b/core/org.argeo.entity.core/pom.xml
deleted file mode 100644 (file)
index 39b697e..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>core</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.entity.core</artifactId>
-       <name>Entity Reference Implementation</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.entity.api</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Commons -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.cms</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/core/org.argeo.entity.core/src/org/argeo/entity/core/JcrEntityDefinition.java b/core/org.argeo.entity.core/src/org/argeo/entity/core/JcrEntityDefinition.java
deleted file mode 100644 (file)
index 7fd26d1..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.argeo.entity.core;
-
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.argeo.api.NodeUtils;
-import org.argeo.entity.EntityConstants;
-import org.argeo.entity.EntityDefinition;
-import org.argeo.jcr.Jcr;
-import org.osgi.framework.BundleContext;
-
-/** An entity definition based on a JCR data structure. */
-public class JcrEntityDefinition implements EntityDefinition {
-       private Repository repository;
-
-       private String type;
-       private String defaultEditoryId;
-
-       public void init(BundleContext bundleContext, Map<String, String> properties) throws RepositoryException {
-               Session adminSession = NodeUtils.openDataAdminSession(repository, null);
-               try {
-                       type = properties.get(EntityConstants.TYPE);
-                       if (type == null)
-                               throw new IllegalArgumentException("Entity type property " + EntityConstants.TYPE + " must be set.");
-                       defaultEditoryId = properties.get(EntityConstants.DEFAULT_EDITORY_ID);
-//                     String definitionPath = EntityNames.ENTITY_DEFINITIONS_PATH + '/' + type;
-//                     if (!adminSession.itemExists(definitionPath)) {
-//                             Node entityDefinition = JcrUtils.mkdirs(adminSession, definitionPath, EntityTypes.ENTITY_DEFINITION);
-////                           entityDefinition.addMixin(EntityTypes.ENTITY_DEFINITION);
-//                             adminSession.save();
-//                     }
-                       initJcr(adminSession);
-               } finally {
-                       Jcr.logout(adminSession);
-               }
-       }
-
-       /** To be overridden in order to perform additional initialisations. */
-       protected void initJcr(Session adminSession) throws RepositoryException {
-
-       }
-
-       public void destroy(BundleContext bundleContext, Map<String, String> properties) throws RepositoryException {
-
-       }
-
-       @Override
-       public String getEditorId(Node entity) {
-               return defaultEditoryId;
-       }
-
-       @Override
-       public String getType() {
-               return type;
-       }
-
-       protected Repository getRepository() {
-               return repository;
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public String toString() {
-               return "Entity Definition " + getType();
-       }
-
-}
diff --git a/core/org.argeo.entity.ui/.classpath b/core/org.argeo.entity.ui/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.argeo.entity.ui/.gitignore b/core/org.argeo.entity.ui/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/core/org.argeo.entity.ui/.project b/core/org.argeo.entity.ui/.project
deleted file mode 100644 (file)
index a1f7177..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.entity.ui</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/core/org.argeo.entity.ui/META-INF/.gitignore b/core/org.argeo.entity.ui/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/core/org.argeo.entity.ui/bnd.bnd b/core/org.argeo.entity.ui/bnd.bnd
deleted file mode 100644 (file)
index e7cd4cb..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-Import-Package:\
-org.eclipse.swt,\
-*
\ No newline at end of file
diff --git a/core/org.argeo.entity.ui/build.properties b/core/org.argeo.entity.ui/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/core/org.argeo.entity.ui/pom.xml b/core/org.argeo.entity.ui/pom.xml
deleted file mode 100644 (file)
index d635fbf..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>core</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.entity.ui</artifactId>
-       <name>Entity UI</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.entity.core</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Commons -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.cms.ui</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-
-               <!-- Specific -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-
-               <!-- Eclipse E4 -->
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp-rap-e4</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <type>pom</type>
-                       <scope>provided</scope>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java b/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/AbstractTermsPart.java
deleted file mode 100644 (file)
index 36ae274..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.argeo.entity.ui.forms;
-
-import javax.jcr.Item;
-
-import org.argeo.cms.Localized;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.util.CmsIcon;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.widgets.ContextOverlay;
-import org.argeo.cms.ui.widgets.StyledControl;
-import org.argeo.entity.Term;
-import org.argeo.entity.TermsManager;
-import org.argeo.entity.Typology;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolItem;
-
-/** Common logic between single and mutliple terms editable part. */
-public abstract class AbstractTermsPart extends StyledControl implements EditablePart {
-       private static final long serialVersionUID = -5497097995341927710L;
-       protected final TermsManager termsManager;
-       protected final Typology typology;
-
-       private final boolean editable;
-
-       private CmsIcon deleteIcon;
-       private CmsIcon addIcon;
-       private CmsIcon cancelIcon;
-
-       private Color highlightColor;
-       private Composite highlight;
-
-       protected final CmsTheme theme;
-       
-       public AbstractTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
-               super(parent, style, item);
-               if (item == null)
-                       throw new IllegalArgumentException("Item cannot be null");
-               this.termsManager = termsManager;
-               this.typology = termsManager.getTypology(typology);
-               this.theme = CmsTheme.getCmsTheme(parent);
-               editable = !(SWT.READ_ONLY == (style & SWT.READ_ONLY));
-               highlightColor = parent.getDisplay().getSystemColor(SWT.COLOR_GRAY);
-       }
-
-       public boolean isEditable() {
-               return editable;
-       }
-
-       protected void createHighlight(Composite block) {
-               highlight = new Composite(block, SWT.NONE);
-               highlight.setBackground(highlightColor);
-               GridData highlightGd = new GridData(SWT.FILL, SWT.FILL, false, false);
-               highlightGd.widthHint = 5;
-               highlightGd.heightHint = 3;
-               highlight.setLayoutData(highlightGd);
-
-       }
-
-       protected String getTermLabel(Term term) {
-               if (term instanceof Localized)
-                       return ((Localized) term).lead();
-               else
-                       return term.getName();
-
-       }
-
-       protected abstract void refresh(ContextOverlay contextArea, String filter, Text txt);
-
-       protected boolean isTermSelectable(Term term) {
-               return true;
-       }
-
-       protected void processTermListLabel(Term term, Label label) {
-
-       }
-
-       protected void setControlLayoutData(Control control) {
-               control.setLayoutData(CmsUiUtils.fillAll());
-       }
-
-       protected void setContainerLayoutData(Composite composite) {
-               composite.setLayoutData(CmsUiUtils.fillAll());
-       }
-
-       //
-       // STYLING
-       //
-       public void setDeleteIcon(CmsIcon deleteIcon) {
-               this.deleteIcon = deleteIcon;
-       }
-
-       public void setAddIcon(CmsIcon addIcon) {
-               this.addIcon = addIcon;
-       }
-
-       public void setCancelIcon(CmsIcon cancelIcon) {
-               this.cancelIcon = cancelIcon;
-       }
-
-       protected TermsManager getTermsManager() {
-               return termsManager;
-       }
-
-       protected void styleDelete(ToolItem deleteItem) {
-               if (deleteIcon != null)
-                       deleteItem.setImage(deleteIcon.getSmallIcon(theme));
-               else
-                       deleteItem.setText("-");
-       }
-
-       protected void styleCancel(ToolItem cancelItem) {
-               if (cancelIcon != null)
-                       cancelItem.setImage(cancelIcon.getSmallIcon(theme));
-               else
-                       cancelItem.setText("X");
-       }
-
-       protected void styleAdd(ToolItem addItem) {
-               if (addIcon != null)
-                       addItem.setImage(addIcon.getSmallIcon(theme));
-               else
-                       addItem.setText("+");
-       }
-}
diff --git a/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java b/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/MultiTermsPart.java
deleted file mode 100644 (file)
index af8df82..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-package org.argeo.entity.ui.forms;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Item;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.ui.forms.FormStyle;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.widgets.ContextOverlay;
-import org.argeo.eclipse.ui.MouseDoubleClick;
-import org.argeo.eclipse.ui.MouseDown;
-import org.argeo.eclipse.ui.Selected;
-import org.argeo.entity.Term;
-import org.argeo.entity.TermsManager;
-import org.argeo.jcr.Jcr;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/** {@link EditablePart} for multiple terms. */
-public class MultiTermsPart extends AbstractTermsPart {
-       private static final long serialVersionUID = -4961135649177920808L;
-       private final static Log log = LogFactory.getLog(MultiTermsPart.class);
-
-       public MultiTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
-               super(parent, style, item, termsManager, typology);
-       }
-
-       @Override
-       protected Control createControl(Composite box, String style) {
-               Composite placeholder = new Composite(box, SWT.NONE);
-
-               boolean vertical = SWT.VERTICAL == (getStyle() & SWT.VERTICAL);
-               RowLayout rl = new RowLayout(vertical ? SWT.VERTICAL : SWT.HORIZONTAL);
-               rl.wrap = true;
-               placeholder.setLayout(rl);
-               List<Term> currentValue = getValue();
-               if (currentValue != null && !currentValue.isEmpty())
-                       for (Term value : currentValue) {
-                               Composite block = new Composite(placeholder, SWT.NONE);
-                               block.setLayout(CmsUiUtils.noSpaceGridLayout(3));
-                               Label lbl = new Label(block, SWT.SINGLE);
-                               String display = getTermLabel(value);
-                               lbl.setText(display);
-                               CmsUiUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style);
-                               processTermListLabel(value, lbl);
-                               if (isEditable())
-                                       lbl.addMouseListener((MouseDoubleClick) (e) -> {
-                                               startEditing();
-                                       });
-                               if (isEditing()) {
-                                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
-                                       ToolItem deleteItem = new ToolItem(toolBar, SWT.FLAT);
-                                       styleDelete(deleteItem);
-                                       deleteItem.addSelectionListener((Selected) (e) -> {
-                                               // we retrieve them again here because they may have changed
-                                               List<Term> curr = getValue();
-                                               List<Term> newValue = new ArrayList<>();
-                                               for (Term v : curr) {
-                                                       if (!v.equals(value))
-                                                               newValue.add(v);
-                                               }
-                                               setValue(newValue);
-                                               block.dispose();
-                                               layout(true, true);
-                                       });
-
-                               }
-                       }
-               else {// empty
-                       if (isEditable() && !isEditing()) {
-                               ToolBar toolBar = new ToolBar(placeholder, SWT.HORIZONTAL);
-                               ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
-                               styleAdd(addItem);
-                               addItem.addSelectionListener((Selected) (e) -> {
-                                       startEditing();
-                               });
-                       }
-               }
-
-               if (isEditing()) {
-                       Composite block = new Composite(placeholder, SWT.NONE);
-                       block.setLayout(CmsUiUtils.noSpaceGridLayout(3));
-
-                       createHighlight(block);
-
-                       Text txt = new Text(block, SWT.SINGLE | SWT.BORDER);
-                       txt.setLayoutData(CmsUiUtils.fillWidth());
-//                     txt.setMessage("[new]");
-
-                       CmsUiUtils.style(txt, style == null ? FormStyle.propertyText.style() : style);
-
-                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
-                       ToolItem cancelItem = new ToolItem(toolBar, SWT.FLAT);
-                       styleCancel(cancelItem);
-                       cancelItem.addSelectionListener((Selected) (e) -> {
-                               stopEditing();
-                       });
-
-                       ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
-                               private static final long serialVersionUID = -7980078594405384874L;
-
-                               @Override
-                               protected void onHide() {
-                                       stopEditing();
-                               }
-                       };
-                       contextOverlay.setLayout(new GridLayout());
-                       // filter
-                       txt.addModifyListener((e) -> {
-                               String filter = txt.getText().toLowerCase();
-                               if ("".equals(filter.trim()))
-                                       filter = null;
-                               refresh(contextOverlay, filter, txt);
-                       });
-                       txt.addFocusListener(new FocusListener() {
-                               private static final long serialVersionUID = -6024501573409619949L;
-
-                               @Override
-                               public void focusLost(FocusEvent event) {
-//                                     if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
-//                                             getDisplay().asyncExec(() -> stopEditing());
-                               }
-
-                               @Override
-                               public void focusGained(FocusEvent event) {
-                                       // txt.setText("");
-                                       if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
-                                               refresh(contextOverlay, null, txt);
-                               }
-                       });
-                       layout(new Control[] { txt });
-                       // getDisplay().asyncExec(() -> txt.setFocus());
-               }
-               return placeholder;
-       }
-
-       @Override
-       protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
-               CmsUiUtils.clear(contextArea);
-               List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
-               List<Term> currentValue = getValue();
-               terms: for (Term term : terms) {
-                       if (currentValue != null && currentValue.contains(term))
-                               continue terms;
-                       String display = getTermLabel(term);
-                       if (filter != null && !display.toLowerCase().contains(filter))
-                               continue terms;
-                       Label termL = new Label(contextArea, SWT.WRAP);
-                       termL.setText(display);
-                       processTermListLabel(term, termL);
-                       if (isTermSelectable(term))
-                               termL.addMouseListener((MouseDown) (e) -> {
-                                       List<Term> newValue = new ArrayList<>();
-                                       List<Term> curr = getValue();
-                                       if (currentValue != null)
-                                               newValue.addAll(curr);
-                                       newValue.add(term);
-                                       setValue(newValue);
-                                       contextArea.hide();
-                                       stopEditing();
-                               });
-               }
-               contextArea.show();
-       }
-
-       protected List<Term> getValue() {
-               String property = typology.getId();
-               List<String> curr = Jcr.getMultiple(getNode(), property);
-               List<Term> res = new ArrayList<>();
-               if (curr != null)
-                       terms: for (String str : curr) {
-                               Term term = termsManager.getTerm(str);
-                               if (term == null) {
-                                       log.warn("Ignoring term " + str + " for " + getNode() + ", as it was not found.");
-                                       continue terms;
-                               }
-                               res.add(term);
-                       }
-               return res;
-       }
-
-       protected void setValue(List<Term> value) {
-               String property = typology.getId();
-               List<String> ids = new ArrayList<>();
-               for (Term term : value) {
-                       ids.add(term.getId());
-               }
-               Jcr.set(getNode(), property, ids);
-               Jcr.save(getNode());
-       }
-
-}
diff --git a/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/SingleTermPart.java b/core/org.argeo.entity.ui/src/org/argeo/entity/ui/forms/SingleTermPart.java
deleted file mode 100644 (file)
index 0b5948a..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.argeo.entity.ui.forms;
-
-import java.util.List;
-
-import javax.jcr.Item;
-
-import org.argeo.cms.ui.forms.FormStyle;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.widgets.ContextOverlay;
-import org.argeo.eclipse.ui.MouseDoubleClick;
-import org.argeo.eclipse.ui.MouseDown;
-import org.argeo.eclipse.ui.Selected;
-import org.argeo.entity.Term;
-import org.argeo.entity.TermsManager;
-import org.argeo.jcr.Jcr;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/** {@link EditablePart} for terms. */
-public class SingleTermPart extends AbstractTermsPart {
-       private static final long serialVersionUID = -4961135649177920808L;
-
-       public SingleTermPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
-               super(parent, style, item, termsManager, typology);
-       }
-
-       @Override
-       protected Control createControl(Composite box, String style) {
-               if (isEditing()) {
-                       Composite block = new Composite(box, SWT.NONE);
-                       block.setLayout(CmsUiUtils.noSpaceGridLayout(3));
-
-                       createHighlight(block);
-
-                       Text txt = new Text(block, SWT.SINGLE | SWT.BORDER);
-                       CmsUiUtils.style(txt, style == null ? FormStyle.propertyText.style() : style);
-
-                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
-                       ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
-                       styleDelete(deleteItem);
-                       deleteItem.addSelectionListener((Selected) (e) -> {
-                               setValue(null);
-                               stopEditing();
-                       });
-                       ToolItem cancelItem = new ToolItem(toolBar, SWT.PUSH);
-                       styleCancel(cancelItem);
-                       cancelItem.addSelectionListener((Selected) (e) -> {
-                               stopEditing();
-                       });
-
-                       ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
-                               private static final long serialVersionUID = -7980078594405384874L;
-
-                               @Override
-                               protected void onHide() {
-                                       stopEditing();
-                               }
-                       };
-                       contextOverlay.setLayout(new GridLayout());
-                       // filter
-                       txt.addModifyListener((e) -> {
-                               String filter = txt.getText().toLowerCase();
-                               if ("".equals(filter.trim()))
-                                       filter = null;
-                               refresh(contextOverlay, filter, txt);
-                       });
-                       txt.addFocusListener(new FocusListener() {
-                               private static final long serialVersionUID = -6024501573409619949L;
-
-                               @Override
-                               public void focusLost(FocusEvent event) {
-//                                     if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
-//                                             getDisplay().asyncExec(() -> stopEditing());
-                               }
-
-                               @Override
-                               public void focusGained(FocusEvent event) {
-                                       // txt.setText("");
-                                       if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
-                                               refresh(contextOverlay, null, txt);
-                               }
-                       });
-                       layout(new Control[] { block });
-                       getDisplay().asyncExec(() -> txt.setFocus());
-                       return block;
-               } else {
-                       Composite block = new Composite(box, SWT.NONE);
-                       block.setLayout(CmsUiUtils.noSpaceGridLayout(2));
-                       Term currentValue = getValue();
-                       if (currentValue != null) {
-                               Label lbl = new Label(block, SWT.SINGLE);
-                               String display = getTermLabel(currentValue);
-                               lbl.setText(display);
-                               CmsUiUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style);
-                               processTermListLabel(currentValue, lbl);
-                               if (isEditable()) {
-                                       lbl.addMouseListener((MouseDoubleClick) (e) -> {
-                                               startEditing();
-                                       });
-                               }
-                       } else {
-                               if (isEditable()) {
-                                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
-                                       ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
-                                       styleAdd(addItem);
-                                       addItem.addSelectionListener((Selected) (e) -> {
-                                               startEditing();
-                                       });
-                               }
-                       }
-                       return block;
-               }
-       }
-
-       @Override
-       protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
-               CmsUiUtils.clear(contextArea);
-               List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
-               terms: for (Term term : terms) {
-                       String display = getTermLabel(term);
-                       if (filter != null && !display.toLowerCase().contains(filter))
-                               continue terms;
-                       Label termL = new Label(contextArea, SWT.WRAP);
-                       termL.setText(display);
-                       processTermListLabel(term, termL);
-                       if (isTermSelectable(term))
-                               termL.addMouseListener((MouseDown) (e) -> {
-                                       setValue(term);
-                                       contextArea.hide();
-                                       stopEditing();
-                               });
-               }
-               contextArea.show();
-               // txt.setFocus();
-       }
-
-       protected Term getValue() {
-               String property = typology.getId();
-               String id = Jcr.get(getNode(), property);
-               Term term = termsManager.getTerm(id);
-
-               return term;
-       }
-
-       protected void setValue(Term value) {
-               String property = typology.getId();
-               Jcr.set(getNode(), property, value != null ? value.getId() : null);
-               Jcr.save(getNode());
-       }
-}
diff --git a/core/org.argeo.suite.core/.classpath b/core/org.argeo.suite.core/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.argeo.suite.core/.gitignore b/core/org.argeo.suite.core/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/core/org.argeo.suite.core/.project b/core/org.argeo.suite.core/.project
deleted file mode 100644 (file)
index ab084af..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.suite.core</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/core/org.argeo.suite.core/META-INF/.gitignore b/core/org.argeo.suite.core/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/core/org.argeo.suite.core/OSGI-INF/maintenanceService.xml b/core/org.argeo.suite.core/OSGI-INF/maintenanceService.xml
deleted file mode 100644 (file)
index 2d495c8..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Suite Maintenance Service">
-   <implementation class="org.argeo.suite.core.SuiteMaintenanceService"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=entity)"/>
-   <reference bind="setUserTransaction" cardinality="1..1" interface="javax.transaction.UserTransaction" name="UserTransaction" policy="static"/>
-   <reference bind="setUserAdmin" cardinality="1..1" interface="org.osgi.service.useradmin.UserAdmin" name="UserAdmin" policy="static"/>
-</scr:component>
diff --git a/core/org.argeo.suite.core/OSGI-INF/termsManager.xml b/core/org.argeo.suite.core/OSGI-INF/termsManager.xml
deleted file mode 100644 (file)
index 3e6d4c6..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Suite Terms Manager">
-   <implementation class="org.argeo.suite.core.SuiteTermsManager"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=entity)"/>
-   <service>
-      <provide interface="org.argeo.entity.TermsManager"/>
-   </service>
-</scr:component>
diff --git a/core/org.argeo.suite.core/bnd.bnd b/core/org.argeo.suite.core/bnd.bnd
deleted file mode 100644 (file)
index 1b9efff..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Bundle-ActivationPolicy: lazy
-
-Service-Component:\
-OSGI-INF/termsManager.xml,\
-OSGI-INF/maintenanceService.xml
-
-Import-Package:\
-javax.transaction,\
-org.osgi.service.useradmin,\
-javax.jcr.nodetype,\
-javax.jcr.security,\
-org.argeo.api,\
-org.argeo.entity,\
-*
\ No newline at end of file
diff --git a/core/org.argeo.suite.core/build.properties b/core/org.argeo.suite.core/build.properties
deleted file mode 100644 (file)
index 6210e84..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/
-source.. = src/
diff --git a/core/org.argeo.suite.core/pom.xml b/core/org.argeo.suite.core/pom.xml
deleted file mode 100644 (file)
index 0c1d40b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>core</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.suite.core</artifactId>
-       <name>Suite Core</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.entity.core</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Commons -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.cms</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.maintenance</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/RankedObject.java b/core/org.argeo.suite.core/src/org/argeo/suite/RankedObject.java
deleted file mode 100644 (file)
index bfba46e..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.argeo.suite;
-
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * A container for an object whose relevance can be ranked. Typically used in an
- * OSGi context with the service.ranking property.
- */
-public class RankedObject<T> {
-       private final static Log log = LogFactory.getLog(RankedObject.class);
-
-       private final static String SERVICE_RANKING = "service.ranking";
-//     private final static String SERVICE_ID = "service.id";
-
-       private T object;
-       private Map<String, Object> properties;
-       private final Long rank;
-
-       public RankedObject(T object, Map<String, Object> properties) {
-               this(object, properties, extractRanking(properties));
-       }
-
-       public RankedObject(T object, Map<String, Object> properties, Long rank) {
-               super();
-               this.object = object;
-               this.properties = properties;
-               this.rank = rank;
-       }
-
-       private static Long extractRanking(Map<String, Object> properties) {
-               if (properties == null)
-                       return 0l;
-               if (properties.containsKey(SERVICE_RANKING))
-                       return Long.valueOf(properties.get(SERVICE_RANKING).toString());
-//             else if (properties.containsKey(SERVICE_ID))
-//                     return (Long) properties.get(SERVICE_ID);
-               else
-                       return 0l;
-       }
-
-       public T get() {
-               return object;
-       }
-
-       public Map<String, Object> getProperties() {
-               return properties;
-       }
-
-       public Long getRank() {
-               return rank;
-       }
-
-       @Override
-       public int hashCode() {
-               return object.hashCode();
-       }
-
-       @Override
-       public boolean equals(Object obj) {
-               if (!(obj instanceof RankedObject))
-                       return false;
-               RankedObject<?> other = (RankedObject<?>) obj;
-               return rank.equals(other.rank) && object.equals(other.object);
-       }
-
-       @Override
-       public String toString() {
-               return object.getClass().getName() + " with rank " + rank;
-       }
-
-       public static <K, T> RankedObject<T> putIfHigherRank(Map<K, RankedObject<T>> map, K key, T object,
-                       Map<String, Object> properties) {
-               RankedObject<T> rankedObject = new RankedObject<>(object, properties);
-               if (!map.containsKey(key)) {
-                       map.put(key, rankedObject);
-                       if (log.isTraceEnabled())
-                               log.trace(
-                                               "Added " + key + " as " + object.getClass().getName() + " with rank " + rankedObject.getRank());
-                       return rankedObject;
-               } else {
-                       RankedObject<T> current = map.get(key);
-                       if (current.getRank() <= rankedObject.getRank()) {
-                               map.put(key, rankedObject);
-                               if (log.isTraceEnabled())
-                                       log.trace("Replaced " + key + " by " + object.getClass().getName() + " with rank "
-                                                       + rankedObject.getRank());
-                               return rankedObject;
-                       } else {
-                               return current;
-                       }
-               }
-
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/RankingKey.java b/core/org.argeo.suite.core/src/org/argeo/suite/RankingKey.java
deleted file mode 100644 (file)
index e099195..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-package org.argeo.suite;
-
-import java.util.Map;
-
-/**
- * Key used to classify and filter available components (typically provided by
- * OSGi services).
- */
-@Deprecated
-public class RankingKey implements Comparable<RankingKey> {
-       public final static String SERVICE_PID = "service.pid";
-       public final static String SERVICE_ID = "service.id";
-       public final static String SERVICE_RANKING = "service.ranking";
-       public final static String DATA_TYPE = "data.type";
-
-       private String pid;
-       private Integer ranking = 0;
-       private Long id = 0l;
-       private String dataType;
-       private String dataPath;
-
-       public RankingKey(String pid, Integer ranking, Long id, String dataType, String dataPath) {
-               super();
-               this.pid = pid;
-               this.ranking = ranking;
-               this.id = id;
-               this.dataType = dataType;
-               this.dataPath = dataPath;
-       }
-
-       public RankingKey(Map<String, Object> properties) {
-               this.pid = properties.containsKey(SERVICE_PID) ? properties.get(SERVICE_PID).toString() : null;
-               this.ranking = properties.containsKey(SERVICE_RANKING)
-                               ? Integer.parseInt(properties.get(SERVICE_RANKING).toString())
-                               : 0;
-               this.id = properties.containsKey(SERVICE_ID) ? (Long) properties.get(SERVICE_ID) : null;
-
-               // Argeo specific
-               this.dataType = properties.containsKey(DATA_TYPE) ? properties.get(DATA_TYPE).toString() : null;
-       }
-
-       @Override
-       public int hashCode() {
-               Integer result = 0;
-               if (pid != null)
-                       result = +pid.hashCode();
-               if (ranking != null)
-                       result = +ranking;
-               if (dataType != null)
-                       result = +dataType.hashCode();
-               return result;
-       }
-
-       @Override
-       protected Object clone() throws CloneNotSupportedException {
-               return new RankingKey(pid, ranking, id, dataType, dataPath);
-       }
-
-       @Override
-       public String toString() {
-               StringBuilder sb = new StringBuilder("");
-               if (pid != null)
-                       sb.append(pid);
-               if (ranking != null && ranking != 0)
-                       sb.append(' ').append(ranking);
-               if (dataType != null)
-                       sb.append(' ').append(dataType);
-               return sb.toString();
-       }
-
-       @Override
-       public boolean equals(Object obj) {
-               if (!(obj instanceof RankingKey))
-                       return false;
-               RankingKey other = (RankingKey) obj;
-               return equalsOrBothNull(pid, other.pid) && equalsOrBothNull(ranking, other.ranking)
-                               && equalsOrBothNull(id, other.id) && equalsOrBothNull(dataType, other.dataType)
-                               && equalsOrBothNull(dataPath, other.dataPath);
-       }
-
-       @Override
-       public int compareTo(RankingKey o) {
-               if (pid != null && o.pid != null) {
-                       if (pid.equals(o.pid)) {
-                               if (ranking.equals(o.ranking))
-                                       if (id != null && o.id != null)
-                                               return id.compareTo(o.id);
-                                       else
-                                               return 0;
-                               else
-                                       return ranking.compareTo(o.ranking);
-                       } else {
-                               return pid.compareTo(o.pid);
-                       }
-
-               } else {
-                       if (dataType != null && o.dataType != null) {
-                               if (dataType.equals(o.dataType)) {
-                                       // TODO factorise
-                                       if (ranking.equals(o.ranking))
-                                               if (id != null && o.id != null)
-                                                       return id.compareTo(o.id);
-                                               else
-                                                       return 0;
-                                       else
-                                               return ranking.compareTo(o.ranking);
-                               } else {
-                                       return dataPath.compareTo(o.dataType);
-                               }
-                       }
-               }
-               return -1;
-       }
-
-       public String getPid() {
-               return pid;
-       }
-
-       public Integer getRanking() {
-               return ranking;
-       }
-
-       public Long getId() {
-               return id;
-       }
-
-       public String getDataType() {
-               return dataType;
-       }
-
-       public String getDataPath() {
-               return dataPath;
-       }
-
-       public static RankingKey minPid(String pid) {
-               return new RankingKey(pid, Integer.MIN_VALUE, null, null, null);
-       }
-
-       public static RankingKey maxPid(String pid) {
-               return new RankingKey(pid, Integer.MAX_VALUE, null, null, null);
-       }
-
-       public static RankingKey minDataType(String dataType) {
-               return new RankingKey(null, Integer.MIN_VALUE, null, dataType, null);
-       }
-
-       public static RankingKey maxDataType(String dataType) {
-               return new RankingKey(null, Integer.MAX_VALUE, null, dataType, null);
-       }
-
-       private static boolean equalsOrBothNull(Object o1, Object o2) {
-               if (o1 == null && o2 == null)
-                       return true;
-               if (o1 == null && o2 != null)
-                       return false;
-               if (o1 != null && o2 == null)
-                       return false;
-               return o2.equals(o1);
-       }
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/SuiteRole.java b/core/org.argeo.suite.core/src/org/argeo/suite/SuiteRole.java
deleted file mode 100644 (file)
index 382f50c..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.argeo.suite;
-
-import org.argeo.api.NodeConstants;
-import org.argeo.naming.Distinguished;
-import org.argeo.naming.LdapAttrs;
-
-/** Office specific roles used in the code */
-public enum SuiteRole implements Distinguished {
-       coworker, manager;
-
-       public String getRolePrefix() {
-               return "org.argeo.suite";
-       }
-
-       public String dn() {
-               return new StringBuilder(LdapAttrs.cn.name()).append("=").append(getRolePrefix()).append(".").append(name())
-                               .append(",").append(NodeConstants.ROLES_BASEDN).toString();
-       }
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java b/core/org.argeo.suite.core/src/org/argeo/suite/SuiteUtils.java
deleted file mode 100644 (file)
index 93f3b14..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.argeo.suite;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.jcr.security.Privilege;
-import javax.naming.ldap.LdapName;
-import javax.security.auth.x500.X500Principal;
-
-import org.argeo.api.NodeConstants;
-import org.argeo.cms.auth.CmsSession;
-import org.argeo.entity.EntityType;
-import org.argeo.jackrabbit.security.JackrabbitSecurityUtils;
-import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.naming.LdapAttrs;
-
-/** Utilities around the Argeo Suite APIs. */
-public class SuiteUtils {
-
-       public static String getUserNodePath(LdapName userDn) {
-               String uid = userDn.getRdn(userDn.size() - 1).getValue().toString();
-               return EntityType.user.basePath() + '/' + uid;
-       }
-
-       public static Node getOrCreateUserNode(Session adminSession, LdapName userDn) {
-               try {
-                       Node usersBase = adminSession.getNode(EntityType.user.basePath());
-                       String uid = userDn.getRdn(userDn.size() - 1).getValue().toString();
-                       Node userNode;
-                       if (!usersBase.hasNode(uid)) {
-                               userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
-                               userNode.addMixin(EntityType.user.get());
-                               userNode.addMixin(NodeType.MIX_CREATED);
-                               userNode.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString());
-                               userNode.setProperty(LdapAttrs.uid.property(), uid);
-                               adminSession.save();
-                               JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(),
-                                               Privilege.JCR_READ);
-                               JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(),
-                                               Privilege.JCR_READ);
-                               JcrUtils.addPrivilege(adminSession, userNode.getPath(), NodeConstants.ROLE_USER_ADMIN,
-                                               Privilege.JCR_ALL);
-                       } else {
-                               userNode = usersBase.getNode(uid);
-                       }
-                       return userNode;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot create user node for " + userDn, e);
-               }
-       }
-
-       public static Node getCmsSessionNode(Session session, CmsSession cmsSession) {
-               try {
-                       return session.getNode(getUserNodePath(cmsSession.getUserDn()) + '/' + cmsSession.getUuid().toString());
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot get session dir for " + cmsSession, e);
-               }
-       }
-
-       public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) {
-               try {
-                       LdapName userDn = cmsSession.getUserDn();
-//                     String uid = userDn.get(userDn.size() - 1);
-                       Node userNode = getOrCreateUserNode(adminSession, userDn);
-//                     if (!usersBase.hasNode(uid)) {
-//                             userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
-//                             userNode.addMixin(EntityType.user.get());
-//                             userNode.addMixin(NodeType.MIX_CREATED);
-//                             usersBase.setProperty(LdapAttrs.uid.property(), uid);
-//                             usersBase.setProperty(LdapAttrs.distinguishedName.property(), userDn.toString());
-//                             adminSession.save();
-//                     } else {
-//                             userNode = usersBase.getNode(uid);
-//                     }
-                       String cmsSessionUuid = cmsSession.getUuid().toString();
-                       Node cmsSessionNode;
-                       if (!userNode.hasNode(cmsSessionUuid)) {
-                               cmsSessionNode = userNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED);
-                               cmsSessionNode.addMixin(NodeType.MIX_CREATED);
-                               adminSession.save();
-                               JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(),
-                                               Privilege.JCR_ALL);
-                       } else {
-                               cmsSessionNode = userNode.getNode(cmsSessionUuid);
-                       }
-                       return cmsSessionNode;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot create session dir for " + cmsSession, e);
-               }
-       }
-
-       /** Singleton. */
-       private SuiteUtils() {
-
-       }
-
-       public static Set<String> extractRoles(String[] semiColArr) {
-               Set<String> res = new HashSet<>();
-               // TODO factorize and make it more robust
-               final String rolesPrefix = "roles:=\"";
-               // first one is layer id
-               for (int i = 1; i < semiColArr.length; i++) {
-                       if (semiColArr[i].startsWith(rolesPrefix)) {
-                               String rolesStr = semiColArr[i].substring(rolesPrefix.length());
-                               // remove last "
-                               rolesStr = rolesStr.substring(0, rolesStr.lastIndexOf('\"'));
-                               // TODO support AND (&) as well
-                               String[] roles = rolesStr.split("\\|");// OR (|)
-                               for (String role : roles) {
-                                       res.add(role.trim());
-                               }
-                       }
-               }
-               return res;
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java b/core/org.argeo.suite.core/src/org/argeo/suite/core/CustomMaintenanceService.java
deleted file mode 100644 (file)
index 5d76eb1..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.argeo.suite.core;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.ImportUUIDBehavior;
-import javax.jcr.ItemExistsException;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.maintenance.AbstractMaintenanceService;
-
-/** Base for custom initialisations. */
-public abstract class CustomMaintenanceService extends AbstractMaintenanceService {
-       private final static Log log = LogFactory.getLog(AbstractMaintenanceService.class);
-
-       protected List<String> getTypologies() {
-               return new ArrayList<>();
-       }
-
-       protected String getTypologiesLoadBase() {
-               return "/sys/terms";
-       }
-
-       protected void loadTypologies(Node customBaseNode) throws RepositoryException, IOException {
-               List<String> typologies = getTypologies();
-               if (!typologies.isEmpty()) {
-                       Node termsBase = JcrUtils.getOrAdd(customBaseNode, EntityType.terms.name(), EntityType.typologies.get());
-                       for (String terms : typologies) {
-                               loadTerms(termsBase, terms);
-                       }
-                       // TODO do not save here, so that upper layers can decide when to save
-                       termsBase.getSession().save();
-               }
-       }
-
-       protected void loadTerms(Node termsBase, String name) throws IOException, RepositoryException {
-               try {
-//                     if (termsBase.hasNode(name))
-//                             return;
-
-                       String termsLoadPath = getTypologiesLoadBase() + '/' + name + ".xml";
-                       URL termsUrl = getClass().getClassLoader().getResource(termsLoadPath);
-                       if (termsUrl == null)
-                               throw new IllegalArgumentException("Terms '" + name + "' not found.");
-                       try (InputStream in = termsUrl.openStream()) {
-                               termsBase.getSession().importXML(termsBase.getPath(), in,
-                                               ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
-                       } catch (ItemExistsException e) {
-                               log.warn("Terms " + name + " exists with another UUID, removing it...");
-                               termsBase.getNode(name).remove();
-                               try (InputStream in = termsUrl.openStream()) {
-                                       termsBase.getSession().importXML(termsBase.getPath(), in,
-                                                       ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
-                               }
-                       }
-                       if (log.isDebugEnabled())
-                               log.debug("Terms '" + name + "' loaded.");
-                       // TODO do not save here, so that upper layers can decide when to save
-                       termsBase.getSession().save();
-               } catch (RepositoryException | IOException e) {
-                       log.error("Cannot load terms '" + name + "': " + e.getMessage());
-                       throw e;
-               }
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteMaintenanceService.java b/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteMaintenanceService.java
deleted file mode 100644 (file)
index b217373..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.argeo.suite.core;
-
-import java.io.IOException;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.jcr.security.Privilege;
-
-import org.argeo.api.NodeConstants;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.maintenance.AbstractMaintenanceService;
-
-/** Initialises an Argeo Suite backend. */
-public class SuiteMaintenanceService extends AbstractMaintenanceService {
-
-       @Override
-       public boolean prepareJcrTree(Session adminSession) throws RepositoryException, IOException {
-               boolean modified = false;
-               Node rootNode = adminSession.getRootNode();
-               if (!rootNode.hasNode(EntityType.user.name())) {
-                       rootNode.addNode(EntityType.user.name(), NodeType.NT_UNSTRUCTURED);
-                       modified = true;
-               }
-               if (modified)
-                       adminSession.save();
-               return modified;
-       }
-
-       @Override
-       public void configurePrivileges(Session adminSession) throws RepositoryException {
-               JcrUtils.addPrivilege(adminSession, EntityType.user.basePath(), NodeConstants.ROLE_USER_ADMIN,
-                               Privilege.JCR_ALL);
-               //JcrUtils.addPrivilege(adminSession, "/", SuiteRole.coworker.dn(), Privilege.JCR_READ);
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTerm.java b/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTerm.java
deleted file mode 100644 (file)
index 227b567..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.argeo.suite.core;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.argeo.entity.Term;
-
-/**
- * A single term. Helper to optimise {@link SuiteTermsManager} implementation.
- */
-class SuiteTerm implements Term {
-       private final String name;
-       private final String relativePath;
-       private final SuiteTypology typology;
-       private final String id;
-
-       private final SuiteTerm parentTerm;
-       private final List<SuiteTerm> subTerms = new ArrayList<>();
-
-       SuiteTerm(SuiteTypology typology, String relativePath, SuiteTerm parentTerm) {
-               this.typology = typology;
-               this.parentTerm = parentTerm;
-               this.relativePath = relativePath;
-               int index = relativePath.lastIndexOf('/');
-               if (index > 0) {
-                       this.name = relativePath.substring(index + 1);
-               } else {
-                       this.name = relativePath;
-               }
-               id = typology.getName() + '/' + relativePath;
-       }
-
-       @Override
-       public String getId() {
-               return id;
-       }
-
-       @Override
-       public String getName() {
-               return name;
-       }
-
-       public String getRelativePath() {
-               return relativePath;
-       }
-
-       @Override
-       public SuiteTypology getTypology() {
-               return typology;
-       }
-
-       @Override
-       public List<SuiteTerm> getSubTerms() {
-               return subTerms;
-       }
-
-       @Override
-       public SuiteTerm getParentTerm() {
-               return parentTerm;
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTermsManager.java b/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTermsManager.java
deleted file mode 100644 (file)
index f8822f7..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.argeo.suite.core;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.argeo.api.NodeConstants;
-import org.argeo.api.NodeUtils;
-import org.argeo.entity.EntityNames;
-import org.argeo.entity.EntityType;
-import org.argeo.entity.Term;
-import org.argeo.entity.TermsManager;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-
-/** Argeo Suite implementation of terms manager. */
-public class SuiteTermsManager implements TermsManager {
-       private final Map<String, SuiteTerm> terms = new HashMap<>();
-       private final Map<String, SuiteTypology> typologies = new HashMap<>();
-
-       // JCR
-       private Repository repository;
-       private Session adminSession;
-
-       public void init() {
-               adminSession = NodeUtils.openDataAdminSession(repository, NodeConstants.SYS_WORKSPACE);
-       }
-
-       @Override
-       public List<Term> listAllTerms(String typology) {
-               List<Term> res = new ArrayList<>();
-               SuiteTypology t = getTypology(typology);
-               for (SuiteTerm term : t.getAllTerms()) {
-                       res.add(term);
-               }
-               return res;
-       }
-
-       @Override
-       public SuiteTerm getTerm(String termId) {
-               return terms.get(termId);
-       }
-
-       @Override
-       public SuiteTypology getTypology(String typology) {
-               SuiteTypology t = typologies.get(typology);
-               if (t == null) {
-                       Node termsNode = Jcr.getNode(adminSession, "SELECT * FROM [{0}] WHERE NAME()=\"{1}\"",
-                                       EntityType.terms.get(), typology);
-                       if (termsNode == null)
-                               throw new IllegalArgumentException("Typology " + typology + " not found.");
-                       t = loadTypology(termsNode);
-               }
-               return t;
-       }
-
-       SuiteTypology loadTypology(Node termsNode) {
-               try {
-                       SuiteTypology typology = new SuiteTypology(termsNode);
-                       for (Node termNode : Jcr.iterate(termsNode.getNodes())) {
-                               if (termNode.isNodeType(EntityType.term.get())) {
-                                       SuiteTerm term = loadTerm(typology, termNode, null);
-                                       if (!term.getSubTerms().isEmpty())
-                                               typology.markNotFlat();
-                                       typology.getSubTerms().add(term);
-                               }
-                       }
-                       typologies.put(typology.getName(), typology);
-                       return typology;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot load typology from " + termsNode, e);
-               }
-       }
-
-       SuiteTerm loadTerm(SuiteTypology typology, Node termNode, SuiteTerm parentTerm) throws RepositoryException {
-               String name = termNode.getProperty(EntityNames.NAME).getString();
-               String relativePath = parentTerm == null ? name : parentTerm.getRelativePath() + '/' + name;
-               SuiteTerm term = new SuiteTerm(typology, relativePath, parentTerm);
-               terms.put(term.getId(), term);
-               for (Node subTermNode : Jcr.iterate(termNode.getNodes())) {
-                       if (termNode.isNodeType(EntityType.term.get())) {
-                               SuiteTerm subTerm = loadTerm(typology, subTermNode, term);
-                               term.getSubTerms().add(subTerm);
-                       }
-               }
-               return term;
-       }
-
-       public void destroy() {
-               Jcr.logout(adminSession);
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTypology.java b/core/org.argeo.suite.core/src/org/argeo/suite/core/SuiteTypology.java
deleted file mode 100644 (file)
index d192ed7..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.argeo.suite.core;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-
-import org.argeo.entity.Term;
-import org.argeo.entity.Typology;
-import org.argeo.jcr.Jcr;
-
-/** A typology. Helper to optimise {@link SuiteTermsManager} implementation. */
-class SuiteTypology implements Typology {
-       private final String name;
-       private final Node node;
-       private boolean isFlat = true;
-
-       private final List<SuiteTerm> subTerms = new ArrayList<>();
-
-       public SuiteTypology(Node node) {
-               this.node = node;
-               this.name = Jcr.getName(this.node);
-       }
-
-       @Override
-       public String getId() {
-               return name;
-       }
-
-       public String getName() {
-               return name;
-       }
-
-       public Node getNode() {
-               return node;
-       }
-
-       void markNotFlat() {
-               if (isFlat)
-                       isFlat = false;
-       }
-
-       @Override
-       public boolean isFlat() {
-               return isFlat;
-       }
-
-       @Override
-       public List<SuiteTerm> getSubTerms() {
-               return subTerms;
-       }
-
-       public List<SuiteTerm> getAllTerms() {
-               if (isFlat)
-                       return subTerms;
-               else {
-                       List<SuiteTerm> terms = new ArrayList<>();
-                       for (SuiteTerm subTerm : subTerms) {
-                               terms.add(subTerm);
-                               collectSubTerms(terms, subTerm);
-                       }
-                       return terms;
-               }
-       }
-
-       private void collectSubTerms(List<SuiteTerm> terms, SuiteTerm term) {
-               for (SuiteTerm subTerm : term.getSubTerms()) {
-                       terms.add(subTerm);
-                       collectSubTerms(terms, subTerm);
-               }
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/library/DocxExtractor.java b/core/org.argeo.suite.core/src/org/argeo/suite/library/DocxExtractor.java
deleted file mode 100644 (file)
index 53e73f3..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
-package org.argeo.suite.library;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.argeo.util.DigestUtils;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.DefaultHandler;
-
-/** Parses a .docx document, trying its best to extract text and table data. */
-public class DocxExtractor {
-       final static String T = "t";
-       final static String TC = "tc";
-       final static String TR = "tr";
-       final static String TBL = "tbl";
-       final static String P = "p";
-       static boolean debug = false;
-
-       final static String PROOF_ERR = "proofErr";
-       final static String TYPE = "type";
-       final static String SPELL_START = "spellStart";
-       final static String SPELL_END = "spellEnd";
-
-       protected List<Tbl> tables = new ArrayList<>();
-       protected List<String> text = new ArrayList<>();
-       protected Map<String, byte[]> media = new TreeMap<>();
-       private Set<String> mediaDigests = new HashSet<>();
-
-       protected void processTextItem(List<String> lines, String str) {
-               lines.add(str);
-       }
-
-       protected boolean skipMedia(String digest) {
-               return false;
-       }
-
-       class DocxHandler extends DefaultHandler {
-
-               private StringBuilder buffer = new StringBuilder();
-               private Tbl currentTbl = null;
-
-               boolean inSpellErr = false;
-               boolean inParagraph = false;
-
-               @Override
-               public void startElement(String uri, String name, String qName, Attributes attributes) throws SAXException {
-                       // System.out.println(localName + " " + qName + " " + uri.hashCode());
-                       if (P.equals(name)) {
-                               if (debug && currentTbl == null)
-                                       System.out.println("# START PARA");
-                               inParagraph = true;
-                       } else if (PROOF_ERR.equals(name)) {
-                               String type = attributes.getValue(uri, TYPE);
-                               if (SPELL_START.equals(type))
-                                       inSpellErr = true;
-                               else if (SPELL_END.equals(type))
-                                       inSpellErr = false;
-
-                       } else if (TBL.equals(name)) {
-                               if (currentTbl != null) {
-                                       Tbl childTbl = new Tbl();
-                                       childTbl.parentTbl = currentTbl;
-                                       currentTbl = childTbl;
-                                       // throw new IllegalStateException("Already an active table");
-                               } else {
-                                       currentTbl = new Tbl();
-                               }
-                       }
-               }
-
-               @Override
-               public void endElement(String uri, String name, String qName) throws SAXException {
-                       if (name.equals(T)) {
-//                             if (inSpellErr) {
-//                                     // do not reset the buffer
-//                                     return;
-//                             }
-
-                               if (currentTbl != null) {
-                                       currentTbl.appendText(buffer.toString());
-                               } else {
-                                       String str = buffer.toString();
-                                       // replace NO-BREAK SPACE by regular space.
-                                       str = str.replace('\u00A0', ' ');
-                                       str = str.strip();
-                                       if (!"".equals(str)) {
-                                               processTextItem(text, str);
-                                       }
-                               }
-                       } else if (name.equals(P)) {
-                               if (debug && currentTbl == null)
-                                       System.out.println("# END PARA");
-                               if (currentTbl != null) {
-                                       currentTbl.currentRow.current.text.append('\n');
-                               } else {
-
-                               }
-                               inParagraph = false;
-                       } else if (name.equals(TC)) {
-                               if (currentTbl != null)
-                                       currentTbl.closeColumn();
-                       } else if (name.equals(TR)) {
-                               if (currentTbl != null)
-                                       currentTbl.closeRow();
-                       } else if (name.equals(TBL)) {
-                               if (currentTbl != null) {
-                                       tables.add(currentTbl);
-                                       if (currentTbl.parentTbl != null)
-                                               currentTbl = currentTbl.parentTbl;
-                                       else
-                                               currentTbl = null;
-                               } else {
-                                       throw new IllegalStateException("Closing a table while none was open.");
-                               }
-                       }
-                       // reset the buffer
-                       buffer.setLength(0);
-               }
-
-               @Override
-               public void characters(char[] ch, int start, int length) throws SAXException {
-                       buffer.append(ch, start, length);
-               }
-
-       }
-
-       public static class Tbl {
-               Tbl parentTbl = null;
-               Tr currentRow = new Tr();
-               List<Tr> rows = new ArrayList<>();
-
-               void appendText(String str) {
-                       currentRow.current.text.append(str);
-               }
-
-               void closeColumn() {
-                       currentRow.columns.add(currentRow.current);
-                       currentRow.current = new Tc();
-               }
-
-               void closeRow() {
-                       rows.add(currentRow);
-                       currentRow = new Tr();
-               }
-
-               public List<Tr> getRows() {
-                       return rows;
-               }
-
-               @Override
-               public String toString() {
-                       StringBuilder sb = new StringBuilder();
-                       for (Tr tr : rows) {
-                               String txt = tr.toString();
-                               sb.append(txt).append('\n');
-                       }
-                       return sb.toString();
-               }
-       }
-
-       public static class Tr {
-               Tc current = new Tc();
-               List<Tc> columns = new ArrayList<>();
-
-               @Override
-               public String toString() {
-                       StringBuilder sb = new StringBuilder();
-                       for (Tc tc : columns) {
-                               sb.append("\"").append(tc.toString()).append("\"").append(',');
-                       }
-                       return sb.toString();
-               }
-
-               public List<Tc> getColumns() {
-                       return columns;
-               }
-
-       }
-
-       public static class Tc {
-               StringBuilder text = new StringBuilder();
-
-               @Override
-               public String toString() {
-                       return text.toString().trim();
-               }
-
-       }
-
-       protected void parse(Reader in) {
-               try {
-                       SAXParserFactory spf = SAXParserFactory.newInstance();
-                       spf.setNamespaceAware(true);
-                       SAXParser saxParser = spf.newSAXParser();
-                       XMLReader xmlReader = saxParser.getXMLReader();
-                       xmlReader.setContentHandler(new DocxHandler());
-                       xmlReader.parse(new InputSource(in));
-               } catch (ParserConfigurationException | SAXException | IOException e) {
-                       throw new RuntimeException("Cannot parse document", e);
-               }
-       }
-
-       public List<String> getText() {
-               return text;
-       }
-
-       public List<Tbl> getTables() {
-               return tables;
-       }
-
-       public Map<String, byte[]> getMedia() {
-               return media;
-       }
-
-       public void load(ZipInputStream zIn) {
-               try {
-                       ZipEntry entry = null;
-                       while ((entry = zIn.getNextEntry()) != null) {
-                               if ("word/document.xml".equals(entry.getName())) {
-                                       try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-                                               byte[] buffer = new byte[2048];
-                                               int len = 0;
-                                               while ((len = zIn.read(buffer)) > 0) {
-                                                       out.write(buffer, 0, len);
-                                               }
-                                               try (Reader reader = new InputStreamReader(new ByteArrayInputStream(out.toByteArray()),
-                                                               StandardCharsets.UTF_8)) {
-                                                       parse(reader);
-                                               }
-                                       }
-                               } else if (entry.getName().startsWith("word/media")) {
-                                       String fileName = entry.getName().substring(entry.getName().lastIndexOf('/') + 1);
-                                       int dotIndex = fileName.lastIndexOf('.');
-                                       String ext = fileName.substring(dotIndex + 1).toLowerCase();
-                                       // we ignore .jfif
-                                       if ("jpeg".equals(ext))
-                                               ext = "jpg";
-                                       fileName = fileName.substring(0, dotIndex) + "." + ext;
-                                       switch (ext) {
-                                       case "png":
-                                       case "jpg":
-                                       case "gif":
-                                       case "bmp":
-                                       case "tiff":
-                                               try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-                                                       byte[] buffer = new byte[2048];
-                                                       int len = 0;
-                                                       while ((len = zIn.read(buffer)) > 0) {
-                                                               out.write(buffer, 0, len);
-                                                       }
-                                                       byte[] bytes = out.toByteArray();
-                                                       String digest = DigestUtils.digest(DigestUtils.MD5, bytes);
-                                                       if (skipMedia(digest))
-                                                               break;
-                                                       if (!mediaDigests.contains(digest)) {
-                                                               media.put(fileName, bytes);
-                                                               mediaDigests.add(digest);
-                                                       }
-                                               }
-                                               break;
-                                       default:
-                                               break;
-                                       }
-                               } else {
-                                       // System.out.println(entry.getName());
-                               }
-                       }
-               } catch (IOException e) {
-                       // TODO Auto-generated catch block
-                       e.printStackTrace();
-               }
-               // throw new IllegalArgumentException("No document.xml found");
-
-       }
-
-//     public static Reader extractDocumentXml(ZipInputStream zIn) throws IOException {
-//             ZipEntry entry = null;
-//             while ((entry = zIn.getNextEntry()) != null) {
-//                     if ("word/document.xml".equals(entry.getName())) {
-//                             try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-//                                     byte[] buffer = new byte[2048];
-//                                     int len = 0;
-//                                     while ((len = zIn.read(buffer)) > 0) {
-//                                             out.write(buffer, 0, len);
-//                                     }
-//                                     return new InputStreamReader(new ByteArrayInputStream(out.toByteArray()), StandardCharsets.UTF_8);
-//                             }
-//                     } else {
-//                             System.out.println(entry.getName());
-//                     }
-//             }
-//             throw new IllegalArgumentException("No document.xml found");
-//     }
-
-//     protected static ZipInputStream openAsZip(String file) throws IOException {
-//             ZipInputStream zIn;
-//             Path path = Paths.get(file);
-//             zIn = new ZipInputStream(Files.newInputStream(path));
-//             return zIn;
-//     }
-
-       public static void main(String[] args) throws IOException {
-               if (args.length == 0)
-                       throw new IllegalArgumentException("Provide a file path");
-               Path p = Paths.get(args[0]);
-
-               DocxExtractor importer = new DocxExtractor();
-               try (ZipInputStream zIn = new ZipInputStream(Files.newInputStream(p))) {
-                       importer.load(zIn);
-               }
-               // display
-               System.out.println("## TEXT");
-               for (int i = 0; i < importer.text.size(); i++) {
-                       String str = importer.text.get(i);
-                       System.out.println(str);
-               }
-
-               System.out.println("\n");
-
-               for (int i = 0; i < importer.tables.size(); i++) {
-                       Tbl tbl = importer.tables.get(i);
-                       System.out.println("## TABLE " + i);
-                       System.out.println(tbl);
-               }
-
-               System.out.println("## MEDIA");
-               for (String fileName : importer.media.keySet()) {
-                       int sizeKb = importer.media.get(fileName).length / 1024;
-                       System.out.println(fileName + " " + sizeKb + " kB");
-               }
-       }
-
-}
diff --git a/core/org.argeo.suite.core/src/org/argeo/suite/util/XPathUtils.java b/core/org.argeo.suite.core/src/org/argeo/suite/util/XPathUtils.java
deleted file mode 100644 (file)
index 66d9aa0..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.argeo.suite.util;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.query.Query;
-import javax.jcr.query.QueryManager;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jackrabbit.util.ISO9075;
-
-/** Ease XPath generation for JCR requests */
-public class XPathUtils {
-       private final static Log log = LogFactory.getLog(XPathUtils.class);
-
-       private final static String QUERY_XPATH = "xpath";
-
-       public static String descendantFrom(String parentPath) {
-               if (notEmpty(parentPath)) {
-                       if ("/".equals(parentPath))
-                               parentPath = "";
-                       // Hardcoded dependency to Jackrabbit. Remove
-                       String result = "/jcr:root" + ISO9075.encodePath(parentPath);
-                       if (log.isTraceEnabled()) {
-                               String result2 = "/jcr:root" + parentPath;
-                               if (!result2.equals(result))
-                                       log.warn("Encoded Path " + result2 + " --> " + result);
-                       }
-                       return result;
-               } else
-                       return "";
-       }
-
-       public static String localAnd(String... conditions) {
-               StringBuilder builder = new StringBuilder();
-               for (String condition : conditions) {
-                       if (notEmpty(condition)) {
-                               builder.append(" ").append(condition).append(" and ");
-                       }
-               }
-               if (builder.length() > 3)
-                       return builder.substring(0, builder.length() - 4);
-               else
-                       return "";
-       }
-
-       public static String xPathNot(String condition) {
-               if (notEmpty(condition))
-                       return "not(" + condition + ")";
-               else
-                       return "";
-       }
-
-       public static String getFreeTextConstraint(String filter) throws RepositoryException {
-               StringBuilder builder = new StringBuilder();
-               if (notEmpty(filter)) {
-                       String[] strs = filter.trim().split(" ");
-                       for (String token : strs) {
-                               builder.append("jcr:contains(.,'*" + encodeXPathStringValue(token) + "*') and ");
-                       }
-                       return builder.substring(0, builder.length() - 4);
-               }
-               return "";
-       }
-
-       public static String getPropertyContains(String propertyName, String filter) throws RepositoryException {
-               if (notEmpty(filter))
-                       return "jcr:contains(@" + propertyName + ",'*" + encodeXPathStringValue(filter) + "*')";
-               return "";
-       }
-
-       private final static DateFormat jcrRefFormatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'+02:00'");
-
-       /**
-        * @param propertyName
-        * @param calendar       the reference date
-        * @param lowerOrGreater "&lt;", "&gt;" TODO validate "&gt;="
-        * @return
-        * @throws RepositoryException
-        */
-       public static String getPropertyDateComparaison(String propertyName, Calendar cal, String lowerOrGreater)
-                       throws RepositoryException {
-               if (cal != null) {
-                       String jcrDateStr = jcrRefFormatter.format(cal.getTime());
-
-                       // jcrDateStr = "2015-08-03T05:00:03:000Z";
-                       String result = "@" + propertyName + " " + lowerOrGreater + " xs:dateTime('" + jcrDateStr + "')";
-                       return result;
-               }
-               return "";
-       }
-
-       public static String getPropertyEquals(String propertyName, String value) {
-               if (notEmpty(value))
-                       return "@" + propertyName + "='" + encodeXPathStringValue(value) + "'";
-               return "";
-       }
-
-       public static String encodeXPathStringValue(String propertyValue) {
-               // TODO implement safer mechanism to escape invalid characters
-               // Also check why we have used this regex in ResourceSerrviceImpl l 474
-               // String cleanedKey = key.replaceAll("(?:')", "''");
-               String result = propertyValue.replaceAll("'", "''");
-               return result;
-       }
-
-       public static void andAppend(StringBuilder builder, String condition) {
-               if (notEmpty(condition)) {
-                       builder.append(condition);
-                       builder.append(" and ");
-               }
-       }
-
-       public static void appendOrderByProperties(StringBuilder builder, boolean ascending, String... propertyNames) {
-               if (propertyNames.length > 0) {
-                       builder.append(" order by ");
-                       for (String propName : propertyNames)
-                               builder.append("@").append(propName).append(", ");
-                       builder = builder.delete(builder.length() - 2, builder.length());
-                       if (ascending)
-                               builder.append(" ascending ");
-                       else
-                               builder.append(" descending ");
-               }
-       }
-
-       public static void appendAndPropStringCondition(StringBuilder builder, String propertyName, String filter)
-                       throws RepositoryException {
-               if (notEmpty(filter)) {
-                       andAppend(builder, getPropertyContains(propertyName, filter));
-               }
-       }
-
-       public static void appendAndNotPropStringCondition(StringBuilder builder, String propertyName, String filter)
-                       throws RepositoryException {
-               if (notEmpty(filter)) {
-                       String cond = getPropertyContains(propertyName, filter);
-                       builder.append(xPathNot(cond));
-                       builder.append(" and ");
-               }
-       }
-
-       public static Query createQuery(Session session, String queryString) throws RepositoryException {
-               QueryManager queryManager = session.getWorkspace().getQueryManager();
-               // Localise JCR properties for XPATH
-               queryString = localiseJcrItemNames(queryString);
-               return queryManager.createQuery(queryString, QUERY_XPATH);
-       }
-
-       private final static String NS_JCR = "\\{http://www.jcp.org/jcr/1.0\\}";
-       private final static String NS_NT = "\\{http://www.jcp.org/jcr/nt/1.0\\}";
-       private final static String NS_MIX = "\\{http://www.jcp.org/jcr/mix/1.0\\}";
-
-       /**
-        * Replace the generic namespace with the local "jcr:", "nt:", "mix:" values. It
-        * is a workaround that must be later cleaned
-        */
-       public static String localiseJcrItemNames(String name) {
-               name = name.replaceAll(NS_JCR, "jcr:");
-               name = name.replaceAll(NS_NT, "nt:");
-               name = name.replaceAll(NS_MIX, "mix:");
-               return name;
-       }
-
-       private static boolean notEmpty(String stringToTest) {
-               return !(stringToTest == null || "".equals(stringToTest.trim()));
-       }
-
-       /** Singleton. */
-       private XPathUtils() {
-
-       }
-}
diff --git a/core/org.argeo.suite.theme.default/.gitignore b/core/org.argeo.suite.theme.default/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/core/org.argeo.suite.theme.default/.project b/core/org.argeo.suite.theme.default/.project
deleted file mode 100644 (file)
index d157155..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.suite.theme.default</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-       </natures>
-</projectDescription>
diff --git a/core/org.argeo.suite.theme.default/META-INF/.gitignore b/core/org.argeo.suite.theme.default/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/core/org.argeo.suite.theme.default/OSGI-INF/cmsTheme.xml b/core/org.argeo.suite.theme.default/OSGI-INF/cmsTheme.xml
deleted file mode 100644 (file)
index 66b8c44..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite Default Theme">
-   <implementation class="org.argeo.cms.ui.util.BundleCmsTheme"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsTheme"/>
-   </service>
-</scr:component>
diff --git a/core/org.argeo.suite.theme.default/bnd.bnd b/core/org.argeo.suite.theme.default/bnd.bnd
deleted file mode 100644 (file)
index 6c4a97c..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-Service-Component:\
-OSGI-INF/cmsTheme.xml
-
-Import-Package:\
-org.argeo.cms.ui.util,\
-*
\ No newline at end of file
diff --git a/core/org.argeo.suite.theme.default/build.properties b/core/org.argeo.suite.theme.default/build.properties
deleted file mode 100644 (file)
index 7f8c707..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-bin.includes = META-INF/,\
-               OSGI-INF/
diff --git a/core/org.argeo.suite.theme.default/pom.xml b/core/org.argeo.suite.theme.default/pom.xml
deleted file mode 100644 (file)
index e9f0092..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>core</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.suite.theme.default</artifactId>
-       <name>Suite Default Theme</name>
-       <packaging>jar</packaging>
-       <dependencies>
-       </dependencies>
-</project>
diff --git a/core/org.argeo.suite.theme.default/rap/work.css b/core/org.argeo.suite.theme.default/rap/work.css
deleted file mode 100644 (file)
index c0aaeb1..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-.argeo-suite-header {
-       color: white;
-       background-color: #00294b;
-}
-
-.argeo-suite-headerTitle {
-       font: bold 18px sans-serif;
-       color: white;
-       background-color: #00294b;
-}
-
-.argeo-suite-leadPane {
-       background-color: #eee;
-}
-
-Label.argeo-suite-leadPane {
-       font: 14px sans-serif;
-       color: #888;
-       background-color: #eee;
-}
-
-Button.argeo-suite-leadPane:hover {
-       cursor:pointer;
-}
-
-.argeo-suite-recentItems {
-       font: bold 14px sans-serif;
-       color: white;
-       background-color: #00294b;
-       padding: 8px 16px;
-}
-
-.argeo-suite-titleContainer {
-       background-color: #00294b;
-       padding: 6px 8px 4px 8px;
-}
-
-.argeo-suite-titleLabel {
-       font: bold 14px sans-serif;
-       color: white;
-       background-color: #00294b;
-}
-
-.argeo-suite-subTitleLabel {
-       font: italic 14px sans-serif;
-       color: #777;
-       padding: 4px 8px;
-}
-
-.argeo-suite-simpleLabel {
-       font: bold 14px sans-serif;
-       padding: 0px;
-}
-
-.argeo-suite-simpleText {
-       font: 14px sans-serif;
-       padding: 0px;
-}
-
-.argeo-suite-titleCell {
-       font: bold 14px sans-serif;
-       background-color: #ddd;
-}
-
-.argeo-suite-inlineButton {
-       padding: 0px 4px;
-       font: 12px sans-serif;
-       border: 1px solid white;
-       color: white;
-       background-image: none;
-       background-color: #00294b;
-}
-
-.argeo-suite-inlineButton:hover {
-       color: #00294b;
-       background-color: white;
-}
-
-Composite.argeo-suite-mainTabBody {
-       background-color: #eee;
-       border: 1px solid #bbb;
-}
-
-.argeo-suite-mainTab {
-       background-color: #eee;
-       border: 1px solid #888;
-}
-
-ToolItem.argeo-suite-mainTab {
-       border: none;
-       background-color: #eee;
-}
-
-ToolItem.argeo-suite-mainTab:hover {
-       background-color: #eee;
-}
-
-
-Button.argeo-suite-mainTab {
-       border: 1px solid #eee;
-       background-color: #eee;
-}
-
-.argeo-suite-mainTab:hover {
-       background-color: #eee;
-}
-
-Button.argeo-suite-mainTab:hover {
-       cursor: pointer;
-       background-color: #eee;
-}
-
-.argeo-suite-mainTabSelected {
-       font: bold 14px sans-serif;
-       color: white;
-       /*background-color: #00294b;*/
-       background-color: #5882b5;
-       border:1px solid #888;
-}
-
-ToolItem.argeo-suite-mainTabSelected {
-       border: none;
-}
-
-ToolItem.argeo-suite-mainTabSelected:hover {
-       background-color: #5882b5;
-}
-
-Button.argeo-suite-mainTabSelected {
-       border: none;
-}
-
-Sash {
-  border: 1px solid white;
-  background-image: none;
-  background-color: white;
-}
-
-Sash:hover {
-  border: 1px solid #5882b5;
-  background-color: #5882b5;
-}
-
-TreeItem{
-       background-color:#fff;
-}
-
-Tree-RowOverlay:selected {
-       color:#fff;
-       background-color:#5882b5;
-}
-
-TableItem{
-       background-color:#fff;
-}
-
-Table-RowOverlay:selected {
-       color:#fff;
-       background-color:#5882b5;
-}
-
-.argeo-suite-navigationBar{
-       background-color:#ddd;
-}
-
-.argeo-suite-navigationTitle{
-       background-color:#ddd;
-       font:bold 14px sans-serif;
-}
-
-.argeo-suite-navigationButton{
-       color:#777;
-       background-color:#ddd;
-       font:bold 14px sans-serif;
-}
-
-.argeo-suite-navigationButton:hover{
-       cursor:pointer;
-       color:#ddd;
-       background-color:#777;
-}
diff --git a/core/org.argeo.suite.theme.default/swt/app.css b/core/org.argeo.suite.theme.default/swt/app.css
deleted file mode 100644 (file)
index 4ac745d..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-.argeo-suite-header {
-       color: white;
-       background-color: #00294b;
-}
-
-.argeo-suite-headerTitle {
-       font: bold 14px sans-serif;
-       color: white;
-       background-color: #00294b;
-}
-
-.argeo-suite-leadPane {
-       background-color: #eee;
-}
-
-Label.argeo-suite-leadPane {
-       font: 11px sans-serif;
-       color: #888;
-       background-color: #eee;
-}
-
-Button.argeo-suite-leadPane:hover {
-       cursor: pointer;
-}
-
-.argeo-suite-recentItems {
-       font: bold 13px sans-serif;
-       color: white;
-       background-color: #00294b;
-       padding: 8px 16px;
-}
-
-.argeo-suite-titleContainer {
-       background-color: #00294b;
-}
-
-.argeo-suite-titleLabel {
-       font: bold 13px sans-serif;
-       margin: 6px 8px 4px 8px;
-       color: white;
-       background-color: #00294b;
-}
-
-.argeo-suite-subTitleLabel {
-       font: italic 14px sans-serif;
-       color: #777;
-       margin: 4px 8px;
-}
-
-.argeo-suite-formLine {
-       padding: 4px 8px 4px 16px;
-}
-
-.argeo-suite-simpleLabel {
-       font: normal 11px sans-serif;
-       border: 8px solid #eee;
-}
-
-.argeo-suite-simpleText {
-       
-}
-
-.argeo-suite-simpleInput {
-       padding: 4px 8px 4px 8px;
-}
-
-.argeo-suite-titleCell {
-       font: bold 11px sans-serif;
-       background-color: #ddd;
-}
-
-.argeo-suite-inlineButton {
-       padding: 0px 4px;
-       font: 12px sans-serif;
-       border: 1px solid white;
-       color: white;
-       background-image: none;
-       background-color: #00294b;
-}
-
-.argeo-suite-inlineButton:hover {
-       color: #00294b;
-       background-color: white;
-}
-
-Composite.argeo-suite-mainTabBody {
-       background-color: #eee;
-       border: 1px solid #bbb;
-}
-
-.argeo-suite-mainTab {
-       background-color: #eee;
-       border: 1px solid #bbb;
-}
-
-ToolItem.argeo-suite-mainTab {
-       border: none;
-       background-color: #eee;
-}
-
-Button.argeo-suite-mainTab {
-       border: none;
-       background-color: #eee;
-}
-
-.argeo-suite-mainTab:hover {
-       background-color: #eee;
-}
-
-Button.argeo-suite-mainTab:hover {
-       cursor: pointer;
-       background-color: #eee;
-}
-
-.argeo-suite-mainTabSelected {
-       font: bold 14px sans-serif;
-       color: white;
-       /*background-color: #00294b;*/
-       background-color: #5882b5;
-       border: 1px solid #00294b;
-}
-
-ToolItem.argeo-suite-mainTabSelected {
-       border: none;
-}
-
-Button.argeo-suite-mainTabSelected {
-       border: none;
-}
\ No newline at end of file
diff --git a/core/org.argeo.suite.ui.rap/.gitignore b/core/org.argeo.suite.ui.rap/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/core/org.argeo.suite.ui.rap/.project b/core/org.argeo.suite.ui.rap/.project
deleted file mode 100644 (file)
index eff6bb0..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.suite.ui.rap</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-       </natures>
-</projectDescription>
diff --git a/core/org.argeo.suite.ui.rap/META-INF/.gitignore b/core/org.argeo.suite.ui.rap/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/core/org.argeo.suite.ui.rap/OSGI-INF/cmsWebApp.xml b/core/org.argeo.suite.ui.rap/OSGI-INF/cmsWebApp.xml
deleted file mode 100644 (file)
index 4dfdcff..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite Web App">
-   <implementation class="org.argeo.cms.web.CmsWebApp"/>
-   <property name="contextName" type="String" value="argeo"/>
-   <reference bind="setCmsApp" cardinality="1..1" interface="org.argeo.cms.ui.CmsApp" name="CmsApp" policy="dynamic" target="(service.pid=argeo.suite.ui.app)" unbind="unsetCmsApp"/>
-   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui.rap/bnd.bnd b/core/org.argeo.suite.ui.rap/bnd.bnd
deleted file mode 100644 (file)
index 35b671b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-Service-Component: OSGI-INF/cmsWebApp.xml
-
-Import-Package:\
-org.argeo.cms.web,\
-org.eclipse.rap.rwt.application,\
-*
diff --git a/core/org.argeo.suite.ui.rap/build.properties b/core/org.argeo.suite.ui.rap/build.properties
deleted file mode 100644 (file)
index 6210e84..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/
-source.. = src/
diff --git a/core/org.argeo.suite.ui.rap/pom.xml b/core/org.argeo.suite.ui.rap/pom.xml
deleted file mode 100644 (file)
index a8a1e80..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>core</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.suite.ui.rap</artifactId>
-       <name>Suite UI RAP</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Eclipse E4 -->
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp-rap-e4</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <type>pom</type>
-                       <scope>provided</scope>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/core/org.argeo.suite.ui/.classpath b/core/org.argeo.suite.ui/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.argeo.suite.ui/.gitignore b/core/org.argeo.suite.ui/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/core/org.argeo.suite.ui/.project b/core/org.argeo.suite.ui/.project
deleted file mode 100644 (file)
index 7146bab..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.suite.ui</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/core/org.argeo.suite.ui/META-INF/.gitignore b/core/org.argeo.suite.ui/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/core/org.argeo.suite.ui/OSGI-INF/cmsApp.xml b/core/org.argeo.suite.ui/OSGI-INF/cmsApp.xml
deleted file mode 100644 (file)
index e42eeeb..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite App">
-   <implementation class="org.argeo.suite.ui.SuiteApp"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsApp"/>
-      <provide interface="org.osgi.service.event.EventHandler"/>
-   </service>
-   <properties entry="config/cmsApp.properties"/>
-   <reference bind="addUiProvider" cardinality="0..n" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" unbind="removeUiProvider"/>
-   <reference bind="addTheme" cardinality="1..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="dynamic" target="(cn=ego)"/>
-   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
-   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.cms.CmsUserManager" name="CmsUserManager" policy="static"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/dashboard.xml b/core/org.argeo.suite.ui/OSGI-INF/dashboard.xml
deleted file mode 100644 (file)
index f678b5b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Default Dashboard">
-   <implementation class="org.argeo.suite.ui.DefaultDashboard"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/dashboard.properties"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/dashboardLayer.xml b/core/org.argeo.suite.ui/OSGI-INF/dashboardLayer.xml
deleted file mode 100644 (file)
index b60eafc..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Dashboard Layer">
-   <implementation class="org.argeo.suite.ui.DefaultEditionLayer"/>
-   <service>
-      <provide interface="org.argeo.suite.ui.SuiteLayer"/>
-   </service>
-   <properties entry="config/dashboardLayer.properties"/>
-   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.suite.ui.recentItems)"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/footer.xml b/core/org.argeo.suite.ui/OSGI-INF/footer.xml
deleted file mode 100644 (file)
index 3499b4f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Footer">
-   <implementation class="org.argeo.suite.ui.DefaultFooter"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/footer.properties"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/header.xml b/core/org.argeo.suite.ui/OSGI-INF/header.xml
deleted file mode 100644 (file)
index 526d9f9..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Header">
-   <implementation class="org.argeo.suite.ui.DefaultHeader"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/header.properties"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/l10n/bundle.properties b/core/org.argeo.suite.ui/OSGI-INF/l10n/bundle.properties
deleted file mode 100644 (file)
index 5716780..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-dashboard=dashboard
-#people=contacts
-documents=documents
-locations=locations
-recentItems=recent items
-
-appTitle=Argeo Suite
-
-#
-# PEOPLE
-# org.argeo.people.ui.PeopleMsg
-#
-person=Person
-organisation=Organisation
-
-# NewPersonWizard
-firstName=First Name
-lastName=Last Name
-salutation=Salutation
-email=Email
-personWizardWindowTitle=New person
-personWizardPageTitle=Create a contact
-
-# NewOrgWizard
-legalName=Legal name
-legalForm=Legal form
-vatId=VAT ID
-orgWizardWindowTitle=New organisation
-orgWizardPageTitle=Create an organisation
-
-
-# ContextAddressComposite
-chooseAnOrganisation=Choose an organisation
-street=Street
-streetComplement=Street complement
-zipCode=Zip code
-city=City
-state=State
-country=Country
-geopoint=Geopoint
-
-# FilteredOrderableEntityTable
-filterHelp=Type filter criterion separated by a space
-
-# BankAccountComposite
-accountHolder=Account holder
-bankName=Bank name
-currency=Currency
-accountNumber=Account number
-bankNumber=Bank number
-BIC=BIC
-IBAN=IBAN
-
-# EditJobDialog
-position=Role
-chosenItem=Chose item
-department=Department
-isPrimary=Is primary
-searchAndChooseEntity=Search and choose a corresponding entity
-
-# ContactListCTab (e4)
-notes=Notes
-addAContact=Add a contact
-contactValue=Contact value
-linkedCompany=Linked company
-
-# OrgAdminInfoCTab (e4)
-paymentAccount=Payment account
-
-# OrgEditor (e4)
-orgDetails=Details
-orgActivityLog=Activity log
-team=Team
-orgAdmin=Admin.
-
-# PersonEditor (e4)
-personDetails=Contact details
-personActivityLog=Activity log
-personOrgs=Organisations
-personSecurity=Security
-
-# PersonSecurityCTab (e4)
-resetPassword=Reset password
-
-# Generic
-label=Label
-aCustomLabel=A custom label
-description=Description
-value=Value
-name=Name
-primary=Primary
-add=Add
-save=Save
-pickUp=Pick up
-
-# Tags
-confirmNewTag=Tag #{0} is not yet registered. Are you sure you want to create it?
-cannotCreateTag=Tag #{0} is not yet registered and you don't have enough rights to create it.
diff --git a/core/org.argeo.suite.ui/OSGI-INF/l10n/bundle_de.properties b/core/org.argeo.suite.ui/OSGI-INF/l10n/bundle_de.properties
deleted file mode 100644 (file)
index 0af19c2..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-dashboard=dashboard
-people=Kontakte
-documents=Dokumente
-locations=Orte
-recentItems=neulich
-
-appTitle=Argeo Suite
-
-#
-# PEOPLE
-# org.argeo.people.ui.PeopleMsg
-#
-person=Person
-organisation=Organisation
-
-# NewPersonWizard
-firstName=Vorname
-lastName=Nachname
-salutation=Salutation
-email=E-Mail
-personWizardWindowTitle=Neue Person
-personWizardPageTitle=Kontakt erstellen
-
-# NewOrgWizard
-legalName=Name
-legalForm=Geschäftsform
-vatId=Ust ID
-orgWizardWindowTitle=Neue Organisation
-orgWizardPageTitle=Organisation erstellen
-
-
-# ContextAddressComposite
-chooseAnOrganisation=Organisation wählen
-street=Strasse
-streetComplement=Strasse Zusatz
-zipCode=PLZ
-city=Stadt
-state=Bundesland
-country=Land
-geopoint=Geopoint
-
-# FilteredOrderableEntityTable
-filterHelp=Type filter criterion separated by a space
-
-# BankAccountComposite
-accountHolder=Kontoinhaber 
-bankName=Name der Bank
-currency=Währung
-accountNumber=Kontonummer
-bankNumber=BLZ
-BIC=BIC
-IBAN=IBAN
-
-# EditJobDialog
-position=Rolle
-chosenItem=Auswahl
-department=Abteilung
-isPrimary=Ist Primär
-searchAndChooseEntity=Suche und wähle ein zugehöriges Objekt
-
-# ContactListCTab (e4)
-notes=Bemerkungen
-addAContact=Kontakt hinzufügen
-contactValue=Kontakt value
-linkedCompany=zugehörige Firma
-
-# OrgAdminInfoCTab (e4)
-paymentAccount=Geschäftskonto
-
-# OrgEditor (e4)
-orgDetails=Details
-orgActivityLog=Aktivitäten Log
-team=Team
-orgAdmin=Admin.
-
-# PersonEditor (e4)
-personDetails=Kontakt Daten
-personActivityLog=Aktivitäten Log
-personOrgs=Organisationen
-personSecurity=Sicherheit
-
-# PersonSecurityCTab (e4)
-resetPassword=Passwort zurücksetzen
-
-# Generic
-label=Beschriftung
-aCustomLabel=Eine spezifische Beschriftung
-description=Beschreibung
-value=Wert
-name=Name
-primary=Haupt-
-add=Hinzufügen
-save=Speichern
-pickUp=Aussuchen
-
-# Tags
-confirmNewTag=Das Hashtag '{0}' existiert noch nicht. WollenSie es hinzufügen?
-cannotCreateTag=Das Hashtag '{0}' existiert nicht uns Sie haben nicht die Rechte, um es hinzufügen.
diff --git a/core/org.argeo.suite.ui/OSGI-INF/l10n/bundle_fr.properties b/core/org.argeo.suite.ui/OSGI-INF/l10n/bundle_fr.properties
deleted file mode 100644 (file)
index 225e5fd..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-dashboard=dashboard
-people=contacts
-documents=documents
-locations=lieux
-recentItems=récent
-
-appTitle=Argeo Suite
-
-#
-# GENERIC
-#
-
-#
-# PEOPLE
-# org.argeo.people.ui.PeopleMsg
-#
-person=Personne
-organisation=Organisation
-
-# NewPersonWizard
-firstName=Prénom
-lastName=Nom
-salutation=Salutation
-email=Email
-personWizardWindowTitle=Nouvelle personne
-personWizardPageTitle=Créer un contact
-
-# NewOrgWizard
-legalName=Nom
-legalForm=Forme légale
-vatId=ID TVA
-orgWizardWindowTitle=Nouvelle organisation
-orgWizardPageTitle=Créer une organisation
-
-
-# ContextAddressComposite
-chooseAnOrganisation=Choisir une organisation
-street=Rue
-streetComplement=Complément rue
-zipCode=Code postal
-city=Ville
-state=État
-country=Pays
-geopoint=Géocoordonnées
-
-# FilteredOrderableEntityTable
-filterHelp=Sasir les critères de filtrage séparés par des espaces 
-
-# BankAccountComposite
-accountHolder=Propriétaire du compte
-bankName=Nom de la banque
-currency=Devise
-accountNumber=Numéro de compte
-bankNumber=Numéro de banque
-BIC=BIC
-IBAN=IBAN
-
-# EditJobDialog
-position=Rôle
-chosenItem=Choisir une Ã©lément
-department=Service
-isPrimary=Principal
-searchAndChooseEntity=Cherhcer et choisir l'entitée correspondante
-
-# ContactListCTab (e4)
-notes=Notes
-addAContact=Ajouter un contact
-contactValue=Valeur
-linkedCompany=Entreprise liée
-
-# OrgAdminInfoCTab (e4)
-paymentAccount=Compte de paiement
-
-# OrgEditor (e4)
-orgDetails=Détails
-orgActivityLog=Activités
-team=Équipe
-orgAdmin=Admin.
-
-# PersonEditor (e4)
-personDetails=Détails du contact
-personActivityLog=Activités
-personOrgs=Organisations
-personSecurity=Accès
-
-# PersonSecurityCTab (e4)
-resetPassword=Force le mot de passe
-
-# Generic
-label=Étiquette
-aCustomLabel=Une Ã©tiquette spécifique
-description=Description
-value=Valeur
-name=Nom
-primary=Principal
-add=Ajouter
-save=Sauver
-pickUp=Choisir
-
-# Tags
-confirmNewTag=Le tag #{0} n'existe pas encore. Voulez-vous le créer?
-cannotCreateTag=Le tag #{0} n'existe pas encore et vous n'avez pas les droits pour le créer.
diff --git a/core/org.argeo.suite.ui/OSGI-INF/leadPane.xml b/core/org.argeo.suite.ui/OSGI-INF/leadPane.xml
deleted file mode 100644 (file)
index c43d933..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Lead Pane">
-   <implementation class="org.argeo.suite.ui.DefaultLeadPane"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/leadPane.properties"/>
-   <property name="defaultLayers" type="String">argeo.suite.ui.dashboardLayer
-argeo.library.ui.contentLayer
-argeo.people.ui.peopleLayer
-argeo.geo.ui.mapLayer
-   </property>
-   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.suite.ui.SuiteLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/loginScreen.xml b/core/org.argeo.suite.ui/OSGI-INF/loginScreen.xml
deleted file mode 100644 (file)
index 0c5377a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Default Login Screen">
-   <implementation class="org.argeo.suite.ui.DefaultLoginScreen"/>
-   <properties entry="config/loginScreen.properties"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/OSGI-INF/recentItems.xml b/core/org.argeo.suite.ui/OSGI-INF/recentItems.xml
deleted file mode 100644 (file)
index 8aaee16..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" name="Default Recent Items">
-   <implementation class="org.argeo.suite.ui.RecentItems"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/recentItems.properties"/>
-</scr:component>
diff --git a/core/org.argeo.suite.ui/bnd.bnd b/core/org.argeo.suite.ui/bnd.bnd
deleted file mode 100644 (file)
index abd4ae2..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-Service-Component:\
-OSGI-INF/cmsApp.xml,\
-OSGI-INF/header.xml,\
-OSGI-INF/footer.xml,\
-OSGI-INF/leadPane.xml,\
-OSGI-INF/loginScreen.xml,\
-OSGI-INF/recentItems.xml,\
-OSGI-INF/dashboard.xml,\
-OSGI-INF/dashboardLayer.xml
-
-Import-Package:\
-org.argeo.api,\
-org.argeo.cms.ui.widgets,\
-org.eclipse.swt,\
-org.osgi.framework,\
-org.argeo.entity,\
-org.eclipse.core.commands.common,\
-org.eclipse.jface.window,\
-org.eclipse.jface.dialogs,\
-*
diff --git a/core/org.argeo.suite.ui/build.properties b/core/org.argeo.suite.ui/build.properties
deleted file mode 100644 (file)
index d829967..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/,\
-               config/,\
-               OSGI-INF/loginScreen.xml,\
-               OSGI-INF/dashboard.xml,\
-               OSGI-INF/recentItems.xml,\
-               OSGI-INF/dashboardLayer.xml
-source.. = src/
diff --git a/core/org.argeo.suite.ui/config/cmsApp.properties b/core/org.argeo.suite.ui/config/cmsApp.properties
deleted file mode 100644 (file)
index 1dec00e..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-service.pid=argeo.suite.ui.app
-
-event.topics=argeo/suite/*
\ No newline at end of file
diff --git a/core/org.argeo.suite.ui/config/dashboard.properties b/core/org.argeo.suite.ui/config/dashboard.properties
deleted file mode 100644 (file)
index 1832543..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.suite.ui.dashboard
diff --git a/core/org.argeo.suite.ui/config/dashboardLayer.properties b/core/org.argeo.suite.ui/config/dashboardLayer.properties
deleted file mode 100644 (file)
index 79abe4c..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-service.pid=argeo.suite.ui.dashboardLayer
-
-title=Dashboard
-icon=dashboard
\ No newline at end of file
diff --git a/core/org.argeo.suite.ui/config/footer.properties b/core/org.argeo.suite.ui/config/footer.properties
deleted file mode 100644 (file)
index 12aca56..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.suite.ui.footer
diff --git a/core/org.argeo.suite.ui/config/header.properties b/core/org.argeo.suite.ui/config/header.properties
deleted file mode 100644 (file)
index 034d5f5..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-service.pid=argeo.suite.ui.header
-argeo.suite.ui=true
-
-argeo.suite.ui.header.title=%appTitle
\ No newline at end of file
diff --git a/core/org.argeo.suite.ui/config/leadPane.properties b/core/org.argeo.suite.ui/config/leadPane.properties
deleted file mode 100644 (file)
index 0d7b193..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.suite.ui.leadPane
diff --git a/core/org.argeo.suite.ui/config/loginScreen.properties b/core/org.argeo.suite.ui/config/loginScreen.properties
deleted file mode 100644 (file)
index 332614d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.suite.ui.loginScreen
diff --git a/core/org.argeo.suite.ui/config/recentItems.properties b/core/org.argeo.suite.ui/config/recentItems.properties
deleted file mode 100644 (file)
index 7321c55..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.suite.ui.recentItems
diff --git a/core/org.argeo.suite.ui/pom.xml b/core/org.argeo.suite.ui/pom.xml
deleted file mode 100644 (file)
index 2436864..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>core</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.suite.ui</artifactId>
-       <name>Suite UI</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.core</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.entity.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Commons -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <scope>provided</scope>
-               </dependency>
-
-               <!-- Eclipse E4 -->
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp-rap-e4</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <type>pom</type>
-                       <scope>provided</scope>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultDashboard.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultDashboard.java
deleted file mode 100644 (file)
index 9835b67..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.argeo.suite.ui;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-/** Provides a dashboard. */
-public class DefaultDashboard implements CmsUiProvider {
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               parent.setLayout(new GridLayout());
-               CmsView cmsView = CmsView.getCmsView(parent);
-               if (cmsView.isAnonymous())
-                       throw new IllegalStateException("No user is not logged in");
-
-               Label lbl = new Label(parent, SWT.NONE);
-               lbl.setText("Welcome " + CurrentUser.getDisplayName() + "!");
-
-               return lbl;
-       }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultEditionLayer.java
deleted file mode 100644 (file)
index 68081b4..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-package org.argeo.suite.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.Localized;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.suite.ui.widgets.TabbedArea;
-import org.argeo.util.LangUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.wiring.BundleWiring;
-
-/** An app layer based on an entry area and an editor area. */
-public class DefaultEditionLayer implements SuiteLayer {
-       private CmsUiProvider entryArea;
-       private CmsUiProvider workArea;
-       private List<String> weights = new ArrayList<>();
-       private boolean startMaximized = false;
-       private boolean singleTab = false;
-       private Localized title = null;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               if (entryArea != null) {
-                       SashFormEditionArea sashFormEditionArea = new SashFormEditionArea(parent, parent.getStyle());
-                       entryArea.createUi(sashFormEditionArea.getEntryArea(), context);
-                       if (this.workArea != null) {
-                               this.workArea.createUi(sashFormEditionArea.getEditorArea(), context);
-                       }
-                       return sashFormEditionArea;
-               } else {
-                       if (this.workArea != null) {
-                               Composite area = new Composite(parent, SWT.NONE);
-                               this.workArea.createUi(area, context);
-                               return area;
-                       }
-                       CmsTheme theme = CmsTheme.getCmsTheme(parent);
-                       TabbedArea tabbedArea = createTabbedArea(parent, theme);
-                       return tabbedArea;
-               }
-       }
-
-       @Override
-       public void view(CmsUiProvider uiProvider, Composite workArea, Node context) {
-               TabbedArea tabbedArea;
-               if (workArea instanceof SashFormEditionArea) {
-                       tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
-               } else if (workArea instanceof TabbedArea) {
-                       tabbedArea = (TabbedArea) workArea;
-               } else
-                       throw new IllegalArgumentException("Unsupported work area " + workArea.getClass().getName());
-               tabbedArea.view(uiProvider, context);
-       }
-
-       @Override
-       public void open(CmsUiProvider uiProvider, Composite workArea, Node context) {
-               TabbedArea tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
-               tabbedArea.open(uiProvider, context);
-       }
-
-       @Override
-       public Localized getTitle() {
-               return title;
-       }
-
-       public void init(BundleContext bundleContext, Map<String, Object> properties) {
-               weights = LangUtils.toStringList(properties.get(Property.weights.name()));
-               startMaximized = properties.containsKey(Property.startMaximized.name())
-                               && "true".equals(properties.get(Property.startMaximized.name()));
-               singleTab = properties.containsKey(Property.singleTab.name())
-                               && "true".equals(properties.get(Property.singleTab.name()));
-
-               String titleStr = (String) properties.get(SuiteLayer.Property.title.name());
-               if (titleStr != null) {
-                       if (titleStr.startsWith("%")) {
-                               title = new Localized() {
-
-                                       @Override
-                                       public String name() {
-                                               return titleStr;
-                                       }
-
-                                       @Override
-                                       public ClassLoader getL10nClassLoader() {
-                                               return bundleContext != null
-                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
-                                                               : getClass().getClassLoader();
-                                       }
-                               };
-                       } else {
-                               title = new Localized.Untranslated(titleStr);
-                       }
-               }
-       }
-
-       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
-
-       }
-
-       public void setEntryArea(CmsUiProvider entryArea) {
-               this.entryArea = entryArea;
-       }
-
-       public void setWorkArea(CmsUiProvider workArea) {
-               this.workArea = workArea;
-       }
-
-       TabbedArea createTabbedArea(Composite parent, CmsTheme theme) {
-               TabbedArea tabbedArea = new TabbedArea(parent, SWT.NONE);
-               tabbedArea.setSingleTab(singleTab);
-               tabbedArea.setBodyStyle(SuiteStyle.mainTabBody.style());
-               tabbedArea.setTabStyle(SuiteStyle.mainTab.style());
-               tabbedArea.setTabSelectedStyle(SuiteStyle.mainTabSelected.style());
-               tabbedArea.setCloseIcon(SuiteIcon.close.getSmallIcon(theme));
-               tabbedArea.setLayoutData(CmsUiUtils.fillAll());
-               return tabbedArea;
-       }
-
-       /** A work area based on an entry area and and a tabbed area. */
-       class SashFormEditionArea extends SashForm {
-               private static final long serialVersionUID = 2219125778722702618L;
-               private CmsTheme theme;
-               private Composite entryArea;
-               private Composite editorArea;
-               private TabbedArea tabbedArea;
-
-               SashFormEditionArea(Composite parent, int style) {
-                       super(parent, SWT.HORIZONTAL);
-                       theme = CmsTheme.getCmsTheme(parent);
-
-                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
-                               editorArea = new Composite(this, SWT.BORDER);
-                               entryArea = new Composite(this, SWT.BORDER);
-                       } else {
-                               entryArea = new Composite(this, SWT.NONE);
-                               editorArea = new Composite(this, SWT.NONE);
-                       }
-
-                       if (weights.size() != 0) {
-                               int[] actualWeight = new int[weights.size()];
-                               for (int i = 0; i < weights.size(); i++) {
-                                       actualWeight[i] = Integer.parseInt(weights.get(i));
-                               }
-                               setWeights(actualWeight);
-                       } else {
-                               int[] actualWeights = new int[] { 3000, 7000 };
-                               setWeights(actualWeights);
-                       }
-                       if (startMaximized)
-                               setMaximizedControl(editorArea);
-                       GridLayout editorAreaLayout = new GridLayout();
-                       editorAreaLayout.verticalSpacing = 0;
-                       editorAreaLayout.marginBottom = 0;
-                       editorAreaLayout.marginHeight = 0;
-                       editorArea.setLayout(editorAreaLayout);
-
-                       if (DefaultEditionLayer.this.workArea == null) {
-                               tabbedArea = createTabbedArea(editorArea, theme);
-                       }
-
-               }
-
-               Composite getEntryArea() {
-                       return entryArea;
-               }
-
-               TabbedArea getTabbedArea() {
-                       return tabbedArea;
-               }
-
-               Composite getEditorArea() {
-                       return editorArea;
-               }
-
-       }
-}
\ No newline at end of file
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultFooter.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultFooter.java
deleted file mode 100644 (file)
index 4ab5474..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.argeo.suite.ui;
-
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.osgi.framework.BundleContext;
-
-/** Footer of a standard Argeo Suite application. */
-public class DefaultFooter implements CmsUiProvider {
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-               Composite content = new Composite(parent, SWT.NONE);
-               content.setLayoutData(new GridData(0, 0));
-               Control contentControl = createContent(content, context);
-
-               // TODO support and guarantee
-
-               return contentControl;
-       }
-
-       protected Control createContent(Composite parent, Node context) throws RepositoryException {
-               return parent;
-       }
-
-       public void init(BundleContext bundleContext, Map<String, String> properties) {
-       }
-
-       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
-
-       }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultHeader.java
deleted file mode 100644 (file)
index 91154c3..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-package org.argeo.suite.ui;
-
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.Localized;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.wiring.BundleWiring;
-
-/** Header of a standard Argeo Suite application. */
-public class DefaultHeader implements CmsUiProvider {
-       public final static String TITLE_PROPERTY = "argeo.suite.ui.header.title";
-       private Localized title = null;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               CmsView cmsView = CmsView.getCmsView(parent);
-               CmsTheme theme = CmsTheme.getCmsTheme(parent);
-
-               parent.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(3, true)));
-
-               // TODO right to left
-               Composite lead = new Composite(parent, SWT.NONE);
-               CmsUiUtils.style(lead, SuiteStyle.header);
-               lead.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, true, false));
-               lead.setLayout(new GridLayout());
-               Label lbl = new Label(lead, SWT.NONE);
-//             String title = properties.get(TITLE_PROPERTY);
-//             // TODO expose the localized
-//             lbl.setText(LocaleUtils.isLocaleKey(title) ? LocaleUtils.local(title, getClass().getClassLoader()).toString()
-//                             : title);
-               lbl.setText(title.lead());
-               CmsUiUtils.style(lbl, SuiteStyle.headerTitle);
-               lbl.setLayoutData(CmsUiUtils.fillWidth());
-
-               Composite middle = new Composite(parent, SWT.NONE);
-               CmsUiUtils.style(middle, SuiteStyle.header);
-               middle.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false));
-               middle.setLayout(new GridLayout());
-
-               Composite end = new Composite(parent, SWT.NONE);
-               CmsUiUtils.style(end, SuiteStyle.header);
-               end.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
-
-               if (!cmsView.isAnonymous()) {
-                       end.setLayout(new GridLayout(2, false));
-                       Label userL = new Label(end, SWT.NONE);
-                       CmsUiUtils.style(userL, SuiteStyle.header);
-                       userL.setText(CurrentUser.getDisplayName());
-                       Button logoutB = new Button(end, SWT.FLAT);
-//                     CmsUiUtils.style(logoutB, SuiteStyle.header);
-                       logoutB.setImage(SuiteIcon.logout.getSmallIcon(theme));
-                       logoutB.addSelectionListener(new SelectionAdapter() {
-                               private static final long serialVersionUID = 7116760083964201233L;
-
-                               @Override
-                               public void widgetSelected(SelectionEvent e) {
-                                       cmsView.logout();
-                               }
-
-                       });
-               } else {
-                       end.setLayout(new GridLayout(1, false));
-                       // required in order to avoid wrong height after logout
-                       new Label(end, SWT.NONE).setText("");
-
-               }
-               return lbl;
-       }
-
-       public void init(BundleContext bundleContext, Map<String, String> properties) {
-               String titleStr = (String) properties.get(TITLE_PROPERTY);
-               if (titleStr != null) {
-                       if (titleStr.startsWith("%")) {
-                               title = new Localized() {
-
-                                       @Override
-                                       public String name() {
-                                               return titleStr;
-                                       }
-
-                                       @Override
-                                       public ClassLoader getL10nClassLoader() {
-                                               return bundleContext != null
-                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
-                                                               : getClass().getClassLoader();
-                                       }
-                               };
-                       } else {
-                               title = new Localized.Untranslated(titleStr);
-                       }
-               }
-       }
-
-       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
-
-       }
-
-       public Localized getTitle() {
-               return title;
-       }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLeadPane.java
deleted file mode 100644 (file)
index 46de177..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-package org.argeo.suite.ui;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.Localized;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.suite.RankedObject;
-import org.argeo.suite.SuiteUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.wiring.BundleWiring;
-
-/** Side pane listing various perspectives. */
-public class DefaultLeadPane implements CmsUiProvider {
-       private final static Log log = LogFactory.getLog(DefaultLeadPane.class);
-
-       public static enum Property {
-               defaultLayers, adminLayers;
-       }
-
-       private Map<String, RankedObject<SuiteLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
-       private List<String> defaultLayers;
-       private List<String> adminLayers = new ArrayList<>();
-
-       private ClassLoader l10nClassLoader;
-
-       @Override
-       public Control createUi(Composite parent, Node node) throws RepositoryException {
-               CmsView cmsView = CmsView.getCmsView(parent);
-               parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-               Composite appLayersC = new Composite(parent, SWT.NONE);
-               CmsUiUtils.style(appLayersC, SuiteStyle.leadPane);
-               GridLayout layout = new GridLayout();
-               layout.verticalSpacing = 10;
-               layout.marginTop = 10;
-               layout.marginLeft = 10;
-               layout.marginRight = 10;
-               appLayersC.setLayout(layout);
-               appLayersC.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
-
-               Composite adminLayersC;
-               if (!adminLayers.isEmpty()) {
-                       adminLayersC = new Composite(parent, SWT.NONE);
-                       CmsUiUtils.style(adminLayersC, SuiteStyle.leadPane);
-                       GridLayout adminLayout = new GridLayout();
-                       adminLayout.verticalSpacing = 10;
-                       adminLayout.marginBottom = 10;
-                       adminLayout.marginLeft = 10;
-                       adminLayout.marginRight = 10;
-                       adminLayersC.setLayout(adminLayout);
-                       adminLayersC.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, true));
-               } else {
-                       adminLayersC = null;
-               }
-
-//             boolean isAdmin = cmsView.doAs(() -> CurrentUser.isInRole(NodeConstants.ROLE_USER_ADMIN));
-               Set<String> userRoles = cmsView.doAs(() -> CurrentUser.roles());
-               Button first = null;
-               layers: for (String layerDef : defaultLayers) {
-                       layerDef = layerDef.trim();
-                       if ("".equals(layerDef))
-                               continue layers;// skip empty lines
-                       String[] semiColArr = layerDef.split(";");
-                       String layerId = semiColArr[0];
-                       Set<String> layerRoles = SuiteUtils.extractRoles(semiColArr);
-                       if (layers.containsKey(layerId)) {
-                               if (!layerRoles.isEmpty()) {
-                                       Set<String> intersection = new HashSet<String>(layerRoles);
-                                       intersection.retainAll(userRoles);
-                                       if (intersection.isEmpty())
-                                               continue layers;// skip unauthorized layer
-                               }
-                               RankedObject<SuiteLayer> layerObj = layers.get(layerId);
-
-                               Localized title = null;
-                               if (!adminLayers.contains(layerId)) {
-                                       String titleStr = (String) layerObj.getProperties().get(SuiteLayer.Property.title.name());
-                                       if (titleStr != null) {
-                                               if (titleStr.startsWith("%")) {
-                                                       // LocaleUtils.local(titleStr, getClass().getClassLoader());
-                                                       title = () -> titleStr;
-                                               } else {
-                                                       title = new Localized.Untranslated(titleStr);
-                                               }
-                                       }
-                               }
-
-                               String iconName = (String) layerObj.getProperties().get(SuiteLayer.Property.icon.name());
-                               SuiteIcon icon = null;
-                               if (iconName != null)
-                                       icon = SuiteIcon.valueOf(iconName);
-
-                               Composite buttonParent;
-                               if (adminLayers.contains(layerId))
-                                       buttonParent = adminLayersC;
-                               else
-                                       buttonParent = appLayersC;
-                               Button b = SuiteUiUtils.createLayerButton(buttonParent, layerId, title, icon, l10nClassLoader);
-                               if (first == null)
-                                       first = b;
-                       }
-               }
-               return first;
-       }
-
-       public void init(BundleContext bundleContext, Map<String, Object> properties) {
-               l10nClassLoader = bundleContext != null ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
-                               : getClass().getClassLoader();
-
-               String[] defaultLayers = (String[]) properties.get(Property.defaultLayers.toString());
-               if (defaultLayers == null)
-                       throw new IllegalArgumentException("Default layers must be set.");
-               this.defaultLayers = Arrays.asList(defaultLayers);
-               if (log.isDebugEnabled())
-                       log.debug("Default layers: " + Arrays.asList(defaultLayers));
-               String[] adminLayers = (String[]) properties.get(Property.adminLayers.toString());
-               if (adminLayers != null) {
-                       this.adminLayers = Arrays.asList(adminLayers);
-                       if (log.isDebugEnabled())
-                               log.debug("Admin layers: " + Arrays.asList(adminLayers));
-               }
-       }
-
-       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
-
-       }
-
-       public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
-               if (properties.containsKey(Constants.SERVICE_PID)) {
-                       String pid = (String) properties.get(Constants.SERVICE_PID);
-                       RankedObject.putIfHigherRank(layers, pid, layer, properties);
-               }
-       }
-
-       public void removeLayer(SuiteLayer layer, Map<String, Object> properties) {
-               if (properties.containsKey(Constants.SERVICE_PID)) {
-                       String pid = (String) properties.get(Constants.SERVICE_PID);
-                       if (layers.containsKey(pid)) {
-                               if (layers.get(pid).equals(new RankedObject<SuiteLayer>(layer, properties))) {
-                                       layers.remove(pid);
-                               }
-                       }
-               }
-       }
-
-//     protected Button createLayerButton(Composite parent, String layer, Localized msg, CmsIcon icon) {
-//             CmsTheme theme = CmsTheme.getCmsTheme(parent);
-//             Button button = new Button(parent, SWT.PUSH);
-//             CmsUiUtils.style(button, SuiteStyle.leadPane);
-//             if (icon != null)
-//                     button.setImage(icon.getBigIcon(theme));
-//             button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false));
-//             // button.setToolTipText(msg.lead());
-//             if (msg != null) {
-//                     Label lbl = new Label(parent, SWT.CENTER);
-//                     CmsUiUtils.style(lbl, SuiteStyle.leadPane);
-//                     // CmsUiUtils.markup(lbl);
-//                     ClassLoader l10nClassLoader = getClass().getClassLoader();
-//                     String txt = LocaleUtils.lead(msg, l10nClassLoader);
-////                   String txt = msg.lead();
-//                     lbl.setText(txt);
-//                     lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
-//             }
-//             CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer);
-//             return button;
-//     }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLoginScreen.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/DefaultLoginScreen.java
deleted file mode 100644 (file)
index 3757a19..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.argeo.suite.ui;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.widgets.auth.CmsLogin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** Provides a login screen. */
-public class DefaultLoginScreen implements CmsUiProvider {
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               CmsView cmsView = CmsView.getCmsView(parent);
-               if (!cmsView.isAnonymous())
-                       throw new IllegalStateException(CurrentUser.getUsername() + " is already logged in");
-
-               parent.setLayout(new GridLayout());
-               Composite loginArea = new Composite(parent, SWT.NONE);
-               loginArea.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
-               
-               CmsLogin cmsLogin = new CmsLogin(cmsView);
-               cmsLogin.createUi(loginArea);
-               return cmsLogin.getCredentialsBlock();
-       }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/RecentItems.java
deleted file mode 100644 (file)
index b9aa5b7..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-package org.argeo.suite.ui;
-
-import static org.argeo.eclipse.ui.EclipseUiUtils.notEmpty;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.observation.Event;
-import javax.jcr.observation.EventIterator;
-import javax.jcr.observation.EventListener;
-import javax.jcr.query.Query;
-import javax.jcr.query.QueryResult;
-
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.suite.ui.widgets.DelayedText;
-import org.argeo.suite.util.XPathUtils;
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/** List recent items. */
-public class RecentItems implements CmsUiProvider {
-       private final static int SEARCH_TEXT_DELAY = 800;
-       private final static int SEARCH_DEFAULT_LIMIT = 100;
-
-       private CmsTheme theme;
-
-       private String entityType;
-
-       static enum Property {
-               entityTypes;
-       }
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               theme = CmsTheme.getCmsTheme(parent);
-               parent.setLayout(new GridLayout());
-//             parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-               parent.setLayout(new GridLayout());
-
-//             Composite top = new Composite(parent, SWT.BORDER);
-//             CmsUiUtils.style(top, SuiteStyle.recentItems);
-//             top.setLayoutData(CmsUiUtils.fillWidth());
-//             top.setLayout(CmsUiUtils.noSpaceGridLayout(2));
-//             Label lbl = new Label(top, SWT.FLAT);
-//             lbl.setLayoutData(CmsUiUtils.fillWidth());
-//             lbl.setText(SuiteMsg.recentItems.lead());
-//             CmsUiUtils.style(lbl, SuiteStyle.recentItems);
-//
-//             ToolBar topToolBar = new ToolBar(top, SWT.NONE);
-//             ToolItem addItem = new ToolItem(topToolBar, SWT.FLAT);
-////           CmsUiUtils.style(addItem, SuiteStyle.recentItems);
-//             addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
-
-               if (context == null)
-                       return null;
-               SingleEntityViewer entityViewer = new SingleEntityViewer(parent, SWT.NONE, context.getSession());
-               entityViewer.createUi();
-               entityViewer.getViewer().getTable().setLayoutData(CmsUiUtils.fillAll());
-
-               Composite bottom = new Composite(parent, SWT.NONE);
-               bottom.setLayoutData(CmsUiUtils.fillWidth());
-               bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
-               ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
-               bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
-               ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
-               deleteItem.setEnabled(false);
-//             CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
-               deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
-               ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
-               addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
-               entityViewer.getViewer().addDoubleClickListener(new IDoubleClickListener() {
-
-                       @Override
-                       public void doubleClick(DoubleClickEvent event) {
-                               Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
-                               if (node != null)
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
-                                                       SuiteEvent.eventProperties(node));
-
-                       }
-               });
-               entityViewer.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
-                       public void selectionChanged(SelectionChangedEvent event) {
-                               Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
-                               if (node != null) {
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
-                                                       SuiteEvent.eventProperties(node));
-                                       deleteItem.setEnabled(true);
-                               } else {
-                                       deleteItem.setEnabled(false);
-                               }
-                       }
-               });
-
-               return entityViewer.filterTxt;
-
-       }
-
-       public void init(Map<String, String> properties) {
-               // TODO manage multiple entities
-               entityType = properties.get(Property.entityTypes.name());
-       }
-
-       class SingleEntityViewer {
-               Composite parent;
-               Text filterTxt;
-               TableViewer viewer;
-               Session session;
-
-               public SingleEntityViewer(Composite parent, int style, Session session) {
-                       this.parent = parent;
-                       this.session = session;
-               }
-
-               public void createUi() {
-                       // MainLayout
-                       addFilterPanel(parent);
-                       viewer = createListPart(parent, new SingleEntityLabelProvider());
-                       refreshFilteredList();
-
-                       try {
-                               String[] nodeTypes = entityType != null && entityType.contains(":") ? new String[] { entityType }
-                                               : null;
-                               session.getWorkspace().getObservationManager().addEventListener(new EventListener() {
-
-                                       @Override
-                                       public void onEvent(EventIterator events) {
-                                               parent.getDisplay().asyncExec(() -> refreshFilteredList());
-                                       }
-                               }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED, "/", true,
-                                               null, nodeTypes, false);
-                       } catch (RepositoryException e) {
-                               throw new IllegalStateException("Cannot add JCR observer", e);
-                       }
-
-               }
-
-               private void addFilterPanel(Composite parent) {
-                       // Use a delayed text: the query won't be done until the user stop
-                       // typing for 800ms
-                       int style = SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL;
-                       DelayedText delayedText = new DelayedText(parent, style, SEARCH_TEXT_DELAY);
-                       filterTxt = delayedText.getText();
-                       filterTxt.setLayoutData(EclipseUiUtils.fillWidth());
-
-                       // final ServerPushSession pushSession = new ServerPushSession();
-                       delayedText.addDelayedModifyListener(null, new ModifyListener() {
-                               private static final long serialVersionUID = 5003010530960334977L;
-
-                               public void modifyText(ModifyEvent event) {
-                                       delayedText.getText().getDisplay().asyncExec(new Runnable() {
-                                               @Override
-                                               public void run() {
-                                                       refreshFilteredList();
-                                               }
-                                       });
-                                       // pushSession.stop();
-                               }
-                       });
-
-                       // Jump to the first item of the list using the down arrow
-                       filterTxt.addKeyListener(new KeyListener() {
-                               private static final long serialVersionUID = -4523394262771183968L;
-
-                               @Override
-                               public void keyReleased(KeyEvent e) {
-                               }
-
-                               @Override
-                               public void keyPressed(KeyEvent e) {
-                                       // boolean shiftPressed = (e.stateMask & SWT.SHIFT) != 0;
-                                       // boolean altPressed = (e.stateMask & SWT.ALT) != 0;
-                                       if (e.keyCode == SWT.ARROW_DOWN || e.keyCode == SWT.TAB) {
-//                                     Object first = entityViewer.getElementAt(0);
-//                                     if (first != null) {
-//                                             entityViewer.getTable().setFocus();
-//                                             entityViewer.setSelection(new StructuredSelection(first), true);
-//                                     }
-                                               e.doit = false;
-                                       }
-                               }
-                       });
-
-                       parent.addDisposeListener((e) -> {
-                               delayedText.close();
-                       });
-               }
-
-               protected TableViewer createListPart(Composite parent, ILabelProvider labelProvider) {
-//                     parent.setLayout(new GridLayout());
-//                     parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-
-                       Composite tableComposite = new Composite(parent, SWT.NONE);
-                       GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_VERTICAL
-                                       | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
-                       tableComposite.setLayoutData(gd);
-
-                       TableViewer viewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-                       viewer.setLabelProvider(labelProvider);
-
-                       TableColumn singleColumn = new TableColumn(viewer.getTable(), SWT.V_SCROLL);
-                       TableColumnLayout tableColumnLayout = new TableColumnLayout();
-                       tableColumnLayout.setColumnData(singleColumn, new ColumnWeightData(85));
-                       tableComposite.setLayout(tableColumnLayout);
-
-                       // Corresponding table & style
-                       Table table = viewer.getTable();
-//                     Listener[] mouseDownListeners = table.getListeners(SWT.MouseDown);
-//                     for (Listener listener :  table.getListeners(SWT.MouseDown))
-//                             table.removeListener(SWT.MouseDown, listener);
-//                     for (Listener listener :  table.getListeners(SWT.MouseUp))
-//                             table.removeListener(SWT.MouseUp, listener);
-//                     for (Listener listener :  table.getListeners(SWT.MouseDoubleClick))
-//                             table.removeListener(SWT.MouseDoubleClick, listener);
-//                     
-//                     table.addMouseListener(new MouseListener() {
-//
-//                             @Override
-//                             public void mouseUp(MouseEvent e) {
-//                                     System.out.println("Mouse up: "+e);
-//                             }
-//
-//                             @Override
-//                             public void mouseDown(MouseEvent e) {
-//                                     System.out.println("Mouse down: "+e);
-//                             }
-//
-//                             @Override
-//                             public void mouseDoubleClick(MouseEvent e) {
-//                                     System.out.println("Mouse double: "+e);
-//
-//                             }
-//                     });
-                       table.setLinesVisible(true);
-                       table.setHeaderVisible(false);
-                       // CmsUiUtils.markup(table);
-                       // CmsUiUtils.setItemHeight(table, 26);
-
-                       viewer.setContentProvider(new BasicNodeListContentProvider());
-                       return viewer;
-               }
-
-//             public boolean setFocus() {
-//                     refreshFilteredList();
-//                     return parent.setFocus();
-//             }
-
-               public void forceRefresh(Object object) {
-                       refreshFilteredList();
-               }
-
-               protected void refreshFilteredList() {
-                       try {
-                               String filter = filterTxt.getText();
-                               // Prevents the query on the full repository
-                               // if (isEmpty(filter)) {
-                               // entityViewer.setInput(null);
-                               // return;
-                               // }
-
-                               // XPATH Query
-                               String xpathQueryStr;
-                               if (entityType != null) {
-                                       int indexColumn = entityType.indexOf(':');
-                                       if (indexColumn > 0) {// JCR node type
-                                               xpathQueryStr = "//element(*, " + entityType + ") order by @jcr:created descending";
-                                       } else {
-                                               xpathQueryStr = entityType.contains(":") ? "//element(*, " + entityType + ")"
-                                                               : "//element(*, " + EntityType.entity.get() + ")[@entity:type='" + entityType + "']";
-                                       }
-                               } else {
-                                       xpathQueryStr = "//element(*, " + EntityType.entity.get() + ")";
-                               }
-//                     String xpathQueryStr = "//element(*, " + ConnectTypes.CONNECT_ENTITY + ")";
-                               String xpathFilter = XPathUtils.getFreeTextConstraint(filter);
-                               if (notEmpty(xpathFilter))
-                                       xpathQueryStr += "[" + xpathFilter + "]";
-
-//                             long begin = System.currentTimeMillis();
-                               // session.refresh(false);
-                               Query xpathQuery = XPathUtils.createQuery(session, xpathQueryStr);
-
-                               xpathQuery.setLimit(SEARCH_DEFAULT_LIMIT);
-                               QueryResult result = xpathQuery.execute();
-
-                               NodeIterator nit = result.getNodes();
-                               viewer.setInput(JcrUtils.nodeIteratorToList(nit));
-//                             if (log.isTraceEnabled()) {
-//                                     long end = System.currentTimeMillis();
-//                                     log.trace("Quick Search - Found: " + nit.getSize() + " in " + (end - begin)
-//                                                     + " ms by executing XPath query (" + xpathQueryStr + ").");
-//                             }
-                       } catch (RepositoryException e) {
-                               throw new IllegalStateException("Unable to list entities", e);
-                       }
-               }
-
-               public TableViewer getViewer() {
-                       return viewer;
-               }
-
-               class SingleEntityLabelProvider extends ColumnLabelProvider {
-                       private static final long serialVersionUID = -2209337675781795677L;
-
-                       @Override
-                       public String getText(Object element) {
-                               return Jcr.getTitle((Node) element);
-                       }
-
-               }
-
-               class BasicNodeListContentProvider implements IStructuredContentProvider {
-                       private static final long serialVersionUID = 1L;
-                       // keep a cache of the Nodes in the content provider to be able to
-                       // manage long request
-                       private List<Node> nodes;
-
-                       public void dispose() {
-                       }
-
-                       /** Expects a list of nodes as a new input */
-                       @SuppressWarnings("unchecked")
-                       public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-                               nodes = (List<Node>) newInput;
-                       }
-
-                       public Object[] getElements(Object arg0) {
-                               return nodes.toArray();
-                       }
-               }
-       }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteApp.java
deleted file mode 100644 (file)
index 32b6da8..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-package org.argeo.suite.ui;
-
-import static org.argeo.cms.ui.CmsView.CMS_VIEW_UID_PROPERTY;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.naming.InvalidNameException;
-import javax.naming.ldap.LdapName;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.api.NodeUtils;
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.LocaleUtils;
-import org.argeo.cms.Localized;
-import org.argeo.cms.auth.CmsSession;
-import org.argeo.cms.ui.AbstractCmsApp;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.dialogs.CmsFeedback;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.specific.UiContext;
-import org.argeo.entity.EntityConstants;
-import org.argeo.entity.EntityNames;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-import org.argeo.suite.RankedObject;
-import org.argeo.suite.SuiteUtils;
-import org.argeo.util.LangUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.osgi.framework.Constants;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventHandler;
-import org.osgi.service.useradmin.User;
-
-/** The Argeo Suite App. */
-public class SuiteApp extends AbstractCmsApp implements EventHandler {
-       private final static Log log = LogFactory.getLog(SuiteApp.class);
-
-       public final static String PUBLIC_BASE_PATH_PROPERTY = "publicBasePath";
-       public final static String DEFAULT_UI_NAME_PROPERTY = "defaultUiName";
-       public final static String DEFAULT_THEME_ID_PROPERTY = "defaultThemeId";
-       private final static String LOGIN = "login";
-
-       private String publicBasePath = null;
-
-       private String pidPrefix;
-       private String headerPid;
-       private String footerPid;
-       private String leadPanePid;
-       private String loginScreenPid;
-
-       private String defaultLayerPid = "argeo.suite.ui.dashboardLayer";
-
-       private String defaultUiName = "app";
-       private String defaultThemeId = "org.argeo.suite.theme.default";
-
-       private Map<String, RankedObject<CmsUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
-       private Map<String, RankedObject<CmsUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
-       private Map<String, RankedObject<SuiteLayer>> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>());
-       private Map<String, RankedObject<SuiteLayer>> layersByType = Collections.synchronizedSortedMap(new TreeMap<>());
-
-       private CmsUserManager cmsUserManager;
-
-       // TODO make more optimal or via CmsSession/CmsView
-       private Map<String, SuiteUi> managedUis = new HashMap<>();
-
-       public void init(Map<String, Object> properties) {
-               if (log.isDebugEnabled())
-                       log.info("Argeo Suite App started");
-
-               if (properties.containsKey(DEFAULT_UI_NAME_PROPERTY))
-                       defaultUiName = LangUtils.get(properties, DEFAULT_UI_NAME_PROPERTY);
-               if (properties.containsKey(DEFAULT_THEME_ID_PROPERTY))
-                       defaultThemeId = LangUtils.get(properties, DEFAULT_THEME_ID_PROPERTY);
-               publicBasePath = LangUtils.get(properties, PUBLIC_BASE_PATH_PROPERTY);
-
-               if (properties.containsKey(Constants.SERVICE_PID)) {
-                       String servicePid = properties.get(Constants.SERVICE_PID).toString();
-                       if (servicePid.endsWith(".app")) {
-                               pidPrefix = servicePid.substring(0, servicePid.length() - "app".length());
-                       }
-               }
-
-               if (pidPrefix == null)
-                       throw new IllegalArgumentException("PID prefix must be set.");
-
-               headerPid = pidPrefix + "header";
-               footerPid = pidPrefix + "footer";
-               leadPanePid = pidPrefix + "leadPane";
-               loginScreenPid = pidPrefix + "loginScreen";
-       }
-
-       public void destroy(Map<String, Object> properties) {
-               for (SuiteUi ui : managedUis.values())
-                       if (!ui.isDisposed())
-                               ui.dispose();
-               if (log.isDebugEnabled())
-                       log.info("Argeo Suite App stopped");
-
-       }
-
-       @Override
-       public Set<String> getUiNames() {
-               HashSet<String> uiNames = new HashSet<>();
-               uiNames.add(defaultUiName);
-               return uiNames;
-       }
-
-       @Override
-       public Composite initUi(Composite parent) {
-               String uiName = parent.getData(UI_NAME_PROPERTY) != null ? parent.getData(UI_NAME_PROPERTY).toString() : null;
-               CmsView cmsView = CmsView.getCmsView(parent);
-               if (cmsView == null)
-                       throw new IllegalStateException("No CMS view is registered.");
-               CmsTheme theme = getTheme(uiName);
-               if (theme != null)
-                       CmsTheme.registerCmsTheme(parent.getShell(), theme);
-               SuiteUi argeoSuiteUi = new SuiteUi(parent, SWT.INHERIT_DEFAULT);
-               String uid = cmsView.getUid();
-               managedUis.put(uid, argeoSuiteUi);
-               argeoSuiteUi.addDisposeListener((e) -> {
-                       managedUis.remove(uid);
-                       if (log.isDebugEnabled())
-                               log.debug("Suite UI " + uid + " has been disposed.");
-               });
-               return argeoSuiteUi;
-       }
-
-       @Override
-       public String getThemeId(String uiName) {
-               return defaultThemeId;
-       }
-
-       @Override
-       public void refreshUi(Composite parent, String state) {
-               try {
-                       Node context = null;
-                       SuiteUi ui = (SuiteUi) parent;
-                       CmsView cmsView = CmsView.getCmsView(parent);
-                       CmsUiProvider headerUiProvider = findUiProvider(headerPid);
-                       CmsUiProvider footerUiProvider = findUiProvider(footerPid);
-                       Localized appTitle = null;
-                       if (headerUiProvider instanceof DefaultHeader) {
-                               appTitle = ((DefaultHeader) headerUiProvider).getTitle();
-                       }
-                       ui.setTitle(appTitle);
-
-                       if (cmsView.isAnonymous() && publicBasePath == null) {// internal app, must login
-                               ui.logout();
-                               if (headerUiProvider != null)
-                                       refreshPart(headerUiProvider, ui.getHeader(), context);
-                               ui.refreshBelowHeader(false);
-                               refreshPart(findUiProvider(loginScreenPid), ui.getBelowHeader(), context);
-                               if (footerUiProvider != null)
-                                       refreshPart(footerUiProvider, ui.getFooter(), context);
-                               ui.layout(true, true);
-                               setState(ui, LOGIN);
-                       } else {
-                               if (LOGIN.equals(state))
-                                       state = null;
-                               CmsSession cmsSession = cmsView.getCmsSession();
-                               if (ui.getUserDir() == null) {
-                                       // FIXME NPE on CMSSession when logging in from anonymous
-                                       if (cmsSession == null || cmsView.isAnonymous()) {
-                                               assert publicBasePath != null;
-                                               ui.initSessions(getRepository(), publicBasePath);
-                                       } else {
-                                               Session adminSession = null;
-                                               try {
-                                                       adminSession = NodeUtils.openDataAdminSession(getRepository(), null);
-                                                       Node userDir = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession);
-                                                       ui.initSessions(getRepository(), userDir.getPath());
-                                               } finally {
-                                                       Jcr.logout(adminSession);
-                                               }
-                                       }
-                               }
-                               initLocale(cmsSession);
-                               context = stateToNode(ui, state);
-                               if (context == null)
-                                       context = ui.getUserDir();
-
-                               if (headerUiProvider != null)
-                                       refreshPart(headerUiProvider, ui.getHeader(), context);
-                               ui.refreshBelowHeader(true);
-                               for (String key : layersByPid.keySet()) {
-                                       SuiteLayer layer = layersByPid.get(key).get();
-                                       ui.addLayer(key, layer);
-                               }
-                               refreshPart(findUiProvider(leadPanePid), ui.getLeadPane(), context);
-                               if (footerUiProvider != null)
-                                       refreshPart(footerUiProvider, ui.getFooter(), context);
-                               ui.layout(true, true);
-                               setState(parent, state != null ? state : defaultLayerPid);
-                       }
-               } catch (Exception e) {
-                       CmsFeedback.show("Unexpected exception", e);
-               }
-       }
-
-       private void initLocale(CmsSession cmsSession) {
-               if (cmsSession == null)
-                       return;
-               Locale locale = cmsSession.getLocale();
-               UiContext.setLocale(locale);
-               LocaleUtils.setThreadLocale(locale);
-
-       }
-
-       private void refreshPart(CmsUiProvider uiProvider, Composite part, Node context) {
-               CmsUiUtils.clear(part);
-               uiProvider.createUiPart(part, context);
-       }
-
-       private CmsUiProvider findUiProvider(String pid) {
-               if (!uiProvidersByPid.containsKey(pid))
-                       return null;
-               return uiProvidersByPid.get(pid).get();
-       }
-
-       private SuiteLayer findLayer(String pid) {
-               if (!layersByPid.containsKey(pid))
-                       return null;
-               return layersByPid.get(pid).get();
-       }
-
-       private <T> T findByType(Map<String, RankedObject<T>> byType, Node context) {
-               if (context == null)
-                       throw new IllegalArgumentException("A node should be provided");
-               try {
-                       // mixins
-                       Set<String> types = new TreeSet<>();
-                       for (NodeType mixinType : context.getMixinNodeTypes()) {
-                               String mixinTypeName = mixinType.getName();
-                               if (byType.containsKey(mixinTypeName)) {
-                                       types.add(mixinTypeName);
-                               }
-                               for (NodeType superType : mixinType.getDeclaredSupertypes()) {
-                                       if (byType.containsKey(superType.getName())) {
-                                               types.add(superType.getName());
-                                       }
-                               }
-                       }
-                       // primary node type
-                       NodeType primaryType = context.getPrimaryNodeType();
-                       String primaryTypeName = primaryType.getName();
-                       if (byType.containsKey(primaryTypeName)) {
-                               types.add(primaryTypeName);
-                       }
-                       for (NodeType superType : primaryType.getDeclaredSupertypes()) {
-                               if (byType.containsKey(superType.getName())) {
-                                       types.add(superType.getName());
-                               }
-                       }
-                       // entity type
-                       if (context.isNodeType(EntityType.entity.get())) {
-                               if (context.hasProperty(EntityNames.ENTITY_TYPE)) {
-                                       String entityTypeName = context.getProperty(EntityNames.ENTITY_TYPE).getString();
-                                       if (byType.containsKey(entityTypeName)) {
-                                               types.add(entityTypeName);
-                                       }
-                               }
-                       }
-
-//                     if (context.getPath().equals("/")) {// root node
-//                             types.add("nt:folder");
-//                     }
-                       if (NodeUtils.isUserHome(context) && byType.containsKey("nt:folder")) {// home node
-                               types.add("nt:folder");
-                       }
-
-                       if (types.size() == 0)
-                               throw new IllegalArgumentException("No type found for " + context + " (" + listTypes(context) + ")");
-                       String type = types.iterator().next();
-                       if (!byType.containsKey(type))
-                               throw new IllegalArgumentException("No component found for " + context + " with type " + type);
-                       return byType.get(type).get();
-               } catch (RepositoryException e) {
-                       throw new IllegalStateException(e);
-               }
-       }
-
-       private static String listTypes(Node context) {
-               try {
-                       StringBuilder sb = new StringBuilder();
-                       sb.append(context.getPrimaryNodeType().getName());
-                       for (NodeType superType : context.getPrimaryNodeType().getDeclaredSupertypes()) {
-                               sb.append(' ');
-                               sb.append(superType.getName());
-                       }
-
-                       for (NodeType nodeType : context.getMixinNodeTypes()) {
-                               sb.append(' ');
-                               sb.append(nodeType.getName());
-                               if (nodeType.getName().equals(EntityType.local.get()))
-                                       sb.append('/').append(context.getProperty(EntityNames.ENTITY_TYPE).getString());
-                               for (NodeType superType : nodeType.getDeclaredSupertypes()) {
-                                       sb.append(' ');
-                                       sb.append(superType.getName());
-                               }
-                       }
-                       return sb.toString();
-               } catch (RepositoryException e) {
-                       throw new JcrException(e);
-               }
-       }
-
-       @Override
-       public void setState(Composite parent, String state) {
-               if (state == null)
-                       return;
-               if (!state.startsWith("/")) {
-                       if (parent instanceof SuiteUi) {
-                               SuiteUi ui = (SuiteUi) parent;
-                               if (LOGIN.equals(state) || state.equals("~")) {
-                                       String appTitle = "";
-                                       if (ui.getTitle() != null)
-                                               appTitle = ui.getTitle().lead();
-                                       ui.getCmsView().stateChanged(state, appTitle);
-                                       return;
-                               }
-                               String currentLayerId = ui.getCurrentLayerId();
-                               if (state.equals(currentLayerId))
-                                       return; // does nothing
-                               else {
-                                       Map<String, Object> properties = new HashMap<>();
-                                       properties.put(SuiteEvent.LAYER, state);
-                                       ui.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), properties);
-                               }
-                       }
-                       return;
-               }
-               SuiteUi suiteUi = (SuiteUi) parent;
-               Node node = stateToNode(suiteUi, state);
-               if (node == null) {
-                       suiteUi.getCmsView().navigateTo("~");
-               } else {
-                       suiteUi.getCmsView().sendEvent(SuiteEvent.switchLayer.topic(), SuiteEvent.eventProperties(node));
-                       suiteUi.getCmsView().sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(node));
-               }
-       }
-
-       private String nodeToState(Node node) {
-               return '/' + Jcr.getWorkspaceName(node) + Jcr.getPath(node);
-       }
-
-       private Node stateToNode(SuiteUi suiteUi, String state) {
-               if (suiteUi == null)
-                       return null;
-               if (state == null || !state.startsWith("/"))
-                       return null;
-
-               String path = state.substring(1);
-               String workspace;
-               if (path.equals("")) {
-                       workspace = null;
-                       path = "/";
-               } else {
-                       int index = path.indexOf('/');
-                       if (index == 0) {
-                               log.error("Cannot interpret " + state);
-//                             cmsView.navigateTo("~");
-                               return null;
-                       } else if (index > 0) {
-                               workspace = path.substring(0, index);
-                               path = path.substring(index);
-                       } else {// index<0, assuming root node
-                               workspace = path;
-                               path = "/";
-                       }
-               }
-               Session session = suiteUi.getSession(workspace);
-               if (session == null)
-                       return null;
-               Node node = Jcr.getNode(session, path);
-               return node;
-       }
-
-       /*
-        * Events management
-        */
-
-       @Override
-       public void handleEvent(Event event) {
-
-               // Specific UI related events
-               SuiteUi ui = getRelatedUi(event);
-               if (ui == null)
-                       return;
-               try {
-                       String appTitle = "";
-                       if (ui.getTitle() != null)
-                               appTitle = ui.getTitle().lead() + " - ";
-
-//                     String currentLayerId = ui.getCurrentLayerId();
-//                     SuiteLayer currentLayer = currentLayerId != null ? layersByPid.get(currentLayerId).get() : null;
-                       if (SuiteUiUtils.isTopic(event, SuiteEvent.refreshPart)) {
-                               Node node = getNode(ui, event);
-                               if (node == null)
-                                       return;
-                               CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
-                               SuiteLayer layer = findByType(layersByType, node);
-                               ui.switchToLayer(layer, node);
-                               ui.getCmsView().runAs(() -> layer.view(uiProvider, ui.getCurrentWorkArea(), node));
-                               ui.getCmsView().stateChanged(nodeToState(node), appTitle + Jcr.getTitle(node));
-                       } else if (SuiteUiUtils.isTopic(event, SuiteEvent.openNewPart)) {
-                               Node node = getNode(ui, event);
-                               if (node == null)
-                                       return;
-                               CmsUiProvider uiProvider = findByType(uiProvidersByType, node);
-                               SuiteLayer layer = findByType(layersByType, node);
-                               ui.switchToLayer(layer, node);
-                               ui.getCmsView().runAs(() -> layer.open(uiProvider, ui.getCurrentWorkArea(), node));
-                               ui.getCmsView().stateChanged(nodeToState(node), appTitle + Jcr.getTitle(node));
-                       } else if (SuiteUiUtils.isTopic(event, SuiteEvent.switchLayer)) {
-                               String layerId = get(event, SuiteEvent.LAYER);
-                               if (layerId != null) {
-//                                     ui.switchToLayer(layerId, ui.getUserDir());
-                                       SuiteLayer suiteLayer = findLayer(layerId);
-                                       Localized layerTitle = suiteLayer.getTitle();
-                                       ui.getCmsView().runAs(() -> ui.switchToLayer(layerId, ui.getUserDir()));
-                                       String title = null;
-                                       if (layerTitle != null)
-                                               title = layerTitle.lead();
-                                       ui.getCmsView().stateChanged(layerId, appTitle + title);
-                               } else {
-                                       Node node = getNode(ui, event);
-                                       if (node != null) {
-                                               SuiteLayer layer = findByType(layersByType, node);
-                                               ui.getCmsView().runAs(() -> ui.switchToLayer(layer, node));
-                                       }
-                               }
-                       }
-               } catch (Exception e) {
-                       log.error("Cannot handle event " + event, e);
-//                     CmsView.getCmsView(ui).exception(e);
-               }
-
-       }
-
-       private Node getNode(SuiteUi ui, Event event) {
-               String nodePath = get(event, SuiteEvent.NODE_PATH);
-               String workspaceName = get(event, SuiteEvent.WORKSPACE);
-               Session session = ui.getSession(workspaceName);
-               Node node;
-               if (nodePath == null) {
-                       // look for a user
-                       String username = get(event, SuiteEvent.USERNAME);
-                       if (username == null)
-                               return null;
-                       User user = cmsUserManager.getUser(username);
-                       if (user == null)
-                               return null;
-                       LdapName userDn;
-                       try {
-                               userDn = new LdapName(user.getName());
-                       } catch (InvalidNameException e) {
-                               throw new IllegalArgumentException("Badly formatted username", e);
-                       }
-                       String userNodePath = SuiteUtils.getUserNodePath(userDn);
-                       if (Jcr.itemExists(session, userNodePath))
-                               node = Jcr.getNode(session, userNodePath);
-                       else {
-                               Session adminSession = null;
-                               try {
-                                       adminSession = NodeUtils.openDataAdminSession(getRepository(), workspaceName);
-                                       SuiteUtils.getOrCreateUserNode(adminSession, userDn);
-                               } finally {
-                                       Jcr.logout(adminSession);
-                               }
-                               node = Jcr.getNode(session, userNodePath);
-                       }
-               } else {
-                       node = Jcr.getNode(session, nodePath);
-               }
-               return node;
-       }
-
-       private SuiteUi getRelatedUi(Event event) {
-               return managedUis.get(get(event, CMS_VIEW_UID_PROPERTY));
-       }
-
-       public static String get(Event event, String key) {
-               Object value = event.getProperty(key);
-               if (value == null)
-                       return null;
-//                     throw new IllegalArgumentException("Property " + key + " must be set");
-               return value.toString();
-
-       }
-
-       /*
-        * Dependency injection.
-        */
-
-       public void addUiProvider(CmsUiProvider uiProvider, Map<String, Object> properties) {
-               if (properties.containsKey(Constants.SERVICE_PID)) {
-                       String pid = (String) properties.get(Constants.SERVICE_PID);
-                       RankedObject.putIfHigherRank(uiProvidersByPid, pid, uiProvider, properties);
-               }
-               if (properties.containsKey(EntityConstants.TYPE)) {
-                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
-                       for (String type : types)
-                               RankedObject.putIfHigherRank(uiProvidersByType, type, uiProvider, properties);
-               }
-       }
-
-       public void removeUiProvider(CmsUiProvider uiProvider, Map<String, Object> properties) {
-               if (properties.containsKey(Constants.SERVICE_PID)) {
-                       String pid = (String) properties.get(Constants.SERVICE_PID);
-                       if (uiProvidersByPid.containsKey(pid)) {
-                               if (uiProvidersByPid.get(pid).equals(new RankedObject<CmsUiProvider>(uiProvider, properties))) {
-                                       uiProvidersByPid.remove(pid);
-                               }
-                       }
-               }
-               if (properties.containsKey(EntityConstants.TYPE)) {
-                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
-                       for (String type : types) {
-                               if (uiProvidersByType.containsKey(type)) {
-                                       if (uiProvidersByType.get(type).equals(new RankedObject<CmsUiProvider>(uiProvider, properties))) {
-                                               uiProvidersByType.remove(type);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       public void addLayer(SuiteLayer layer, Map<String, Object> properties) {
-               if (properties.containsKey(Constants.SERVICE_PID)) {
-                       String pid = (String) properties.get(Constants.SERVICE_PID);
-                       RankedObject.putIfHigherRank(layersByPid, pid, layer, properties);
-               }
-               if (properties.containsKey(EntityConstants.TYPE)) {
-                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
-                       for (String type : types)
-                               RankedObject.putIfHigherRank(layersByType, type, layer, properties);
-               }
-       }
-
-       public void removeLayer(SuiteLayer layer, Map<String, Object> properties) {
-               if (properties.containsKey(Constants.SERVICE_PID)) {
-                       String pid = (String) properties.get(Constants.SERVICE_PID);
-                       if (layersByPid.containsKey(pid)) {
-                               if (layersByPid.get(pid).equals(new RankedObject<SuiteLayer>(layer, properties))) {
-                                       layersByPid.remove(pid);
-                               }
-                       }
-               }
-               if (properties.containsKey(EntityConstants.TYPE)) {
-                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
-                       for (String type : types) {
-                               if (layersByType.containsKey(type)) {
-                                       if (layersByType.get(type).equals(new RankedObject<CmsUiProvider>(layer, properties))) {
-                                               layersByType.remove(type);
-                                       }
-                               }
-                       }
-               }
-       }
-
-       public void setCmsUserManager(CmsUserManager cmsUserManager) {
-               this.cmsUserManager = cmsUserManager;
-       }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteEvent.java
deleted file mode 100644 (file)
index 563cd21..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.argeo.suite.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.jcr.Node;
-
-import org.argeo.cms.ui.util.CmsEvent;
-import org.argeo.jcr.Jcr;
-import org.osgi.service.useradmin.User;
-
-/** Events specific to Argeo Suite. */
-public enum SuiteEvent implements CmsEvent {
-       openNewPart, refreshPart, switchLayer;
-
-       public final static String LAYER = "layer";
-//     public final static String NODE_ID = "nodeId";
-       public final static String NODE_PATH = "path";
-       public final static String USERNAME = "username";
-       public final static String WORKSPACE = "workspace";
-
-       public String getTopicBase() {
-               return "argeo/suite/ui";
-       }
-
-       public static Map<String, Object> eventProperties(Node node) {
-               Map<String, Object> properties = new HashMap<>();
-               properties.put(NODE_PATH, Jcr.getPath(node));
-               properties.put(WORKSPACE, Jcr.getWorkspaceName(node));
-               return properties;
-       }
-
-       public static Map<String, Object> eventProperties(User user) {
-               Map<String, Object> properties = new HashMap<>();
-               properties.put(USERNAME, user.getName());
-               return properties;
-       }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteIcon.java
deleted file mode 100644 (file)
index e40ba5a..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.argeo.suite.ui;
-
-import org.argeo.cms.ui.util.CmsIcon;
-
-/** Icon names used by Argeo Suite. */
-public enum SuiteIcon implements CmsIcon {
-       add, save, close, search, delete, logout, dashboard,
-       // people
-       people, person, organisation,
-       // library
-       documents, document, folder,
-       // admin and settings
-       settings, user,
-       // misc
-       task, tag, location, inbox, map;
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteLayer.java
deleted file mode 100644 (file)
index c081662..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.argeo.suite.ui;
-
-import javax.jcr.Node;
-
-import org.argeo.cms.Localized;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.eclipse.swt.widgets.Composite;
-
-/** An UI layer for the main work area. */
-public interface SuiteLayer extends CmsUiProvider {
-       static enum Property {
-               title, icon, weights, startMaximized, singleTab;
-       }
-
-       void view(CmsUiProvider uiProvider, Composite workArea, Node context);
-
-       default void open(CmsUiProvider uiProvider, Composite workArea, Node context) {
-               view(uiProvider, workArea, context);
-       }
-
-       default Localized getTitle() {
-               return null;
-       }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteMsg.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteMsg.java
deleted file mode 100644 (file)
index 3b376db..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.argeo.suite.ui;
-
-import org.argeo.cms.Localized;
-
-/** Localized messages. */
-public enum SuiteMsg implements Localized {
-       dashboard, people, documents, locations, recentItems,
-       // NewPersonWizard
-       firstName, lastName, salutation, email, personWizardWindowTitle, personWizardPageTitle,
-       // NewOrgWizard
-       orgWizardWindowTitle, orgWizardPageTitle, legalName, legalForm, vatId,
-       // ContextAddressComposite
-       chooseAnOrganisation, street, streetComplement, zipCode, city, state, country, geopoint,
-       // FilteredOrderableEntityTable
-       filterHelp,
-       // BankAccountComposite
-       accountHolder, bankName, currency, accountNumber, bankNumber, BIC, IBAN,
-       // EditJobDialog
-       position, chosenItem, department, isPrimary, searchAndChooseEntity,
-       // ContactListCTab (e4)
-       notes, addAContact, contactValue, linkedCompany,
-       // OrgAdminInfoCTab (e4)
-       paymentAccount,
-       // OrgEditor (e4)
-       orgDetails, orgActivityLog, team, orgAdmin,
-       // PersonEditor (e4)
-       personDetails, personActivityLog, personOrgs, personSecurity,
-       // PersonSecurityCTab (e4)
-       resetPassword,
-       // Generic
-       label, aCustomLabel, description, value, name, primary, add, save, pickup,
-       // Tag
-       confirmNewTag, cannotCreateTag;
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteStyle.java
deleted file mode 100644 (file)
index 0156801..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.argeo.suite.ui;
-
-import org.argeo.cms.ui.util.CmsStyle;
-
-/** Styles used by Argeo Suite work UI. */
-public enum SuiteStyle implements CmsStyle {
-       // header
-       header, headerTitle, headerMenu, headerMenuItem,
-       // footer
-       footer,
-       // recent items
-       recentItems,
-       // lead pane
-       leadPane, leadPaneItem, leadPaneSectionTitle, leadPaneSubSectionTitle,
-       // group composite
-       titleContainer, titleLabel, subTitleLabel, formLine, formColumn, navigationBar, navigationTitle, navigationButton,
-       // forms elements
-       simpleLabel, simpleText, simpleInput,
-       // table
-       titleCell,
-       // layers
-       workArea,
-       // tabbed area
-       mainTabBody, mainTabSelected, mainTab,
-       // buttons
-       inlineButton;
-
-       @Override
-       public String getClassPrefix() {
-               return "argeo-suite";
-       }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUi.java
deleted file mode 100644 (file)
index ca2d9c3..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-package org.argeo.suite.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.api.NodeConstants;
-import org.argeo.cms.Localized;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.jcr.Jcr;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FormLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/** The view for the default ergonomics of Argeo Suite. */
-class SuiteUi extends Composite {
-       private static final long serialVersionUID = 6207018859086689108L;
-       private final static Log log = LogFactory.getLog(SuiteUi.class);
-
-       private Localized title;
-       private Composite header;
-       private Composite footer;
-       private Composite belowHeader;
-       private Composite leadPane;
-       private Composite dynamicArea;
-
-       private Session sysSession;
-       private Session homeSession;
-       private Node userDir;
-
-       private Map<String, SuiteLayer> layers = new HashMap<>();
-       private Map<String, Composite> workAreas = new HashMap<>();
-       private String currentLayerId = null;
-
-       private CmsView cmsView;
-
-       public SuiteUi(Composite parent, int style) {
-               super(parent, style);
-               cmsView = CmsView.getCmsView(parent);
-               this.setLayout(CmsUiUtils.noSpaceGridLayout());
-
-               header = new Composite(this, SWT.NONE);
-               header.setLayout(CmsUiUtils.noSpaceGridLayout());
-               CmsUiUtils.style(header, SuiteStyle.header);
-               header.setLayoutData(CmsUiUtils.fillWidth());
-
-               belowHeader = new Composite(this, SWT.NONE);
-               belowHeader.setLayoutData(CmsUiUtils.fillAll());
-
-               footer = new Composite(this, SWT.NONE);
-               footer.setLayout(CmsUiUtils.noSpaceGridLayout());
-               CmsUiUtils.style(footer, SuiteStyle.footer);
-               footer.setLayoutData(CmsUiUtils.fillWidth());
-       }
-
-       public void refreshBelowHeader(boolean initApp) {
-               CmsUiUtils.clear(belowHeader);
-               int style = getStyle();
-               if (initApp) {
-                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout(2));
-
-                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
-                               dynamicArea = new Composite(belowHeader, SWT.NONE);
-                               leadPane = new Composite(belowHeader, SWT.NONE);
-                       } else {
-                               leadPane = new Composite(belowHeader, SWT.NONE);
-                               dynamicArea = new Composite(belowHeader, SWT.NONE);
-                       }
-                       leadPane.setLayoutData(CmsUiUtils.fillHeight());
-                       leadPane.setLayout(CmsUiUtils.noSpaceGridLayout());
-                       CmsUiUtils.style(leadPane, SuiteStyle.leadPane);
-
-                       dynamicArea.setLayoutData(CmsUiUtils.fillAll());
-                       dynamicArea.setLayout(new FormLayout());
-
-               } else {
-                       belowHeader.setLayout(CmsUiUtils.noSpaceGridLayout());
-               }
-       }
-
-       /*
-        * LAYERS
-        */
-
-       Composite getCurrentWorkArea() {
-               if (currentLayerId == null)
-                       throw new IllegalStateException("No current layer");
-               return workAreas.get(currentLayerId);
-       }
-
-       String getCurrentLayerId() {
-               return currentLayerId;
-       }
-
-       private Composite getLayer(String id, Node context) {
-               if (!layers.containsKey(id))
-                       return null;
-               if (!workAreas.containsKey(id))
-                       initLayer(id, layers.get(id), context);
-               return workAreas.get(id);
-       }
-
-       Composite switchToLayer(String layerId, Node context) {
-               Composite current = null;
-               if (currentLayerId != null) {
-                       current = getCurrentWorkArea();
-                       if (currentLayerId.equals(layerId))
-                               return current;
-               }
-               if (context == null) {
-                       if (!cmsView.isAnonymous())
-                               context = userDir;
-               }
-               Composite toShow = getLayer(layerId, context);
-               if (toShow != null) {
-                       currentLayerId = layerId;
-                       if (!isDisposed()) {
-//                             getDisplay().syncExec(() -> {
-                               if (!toShow.isDisposed()) {
-                                       toShow.moveAbove(null);
-                               } else {
-                                       log.warn("Cannot show work area because it is disposed.");
-                                       toShow = initLayer(layerId, layers.get(layerId), context);
-                                       toShow.moveAbove(null);
-                               }
-                               dynamicArea.layout(true, true);
-//                             });
-                       }
-                       return toShow;
-               } else {
-                       return current;
-               }
-       }
-
-       Composite switchToLayer(SuiteLayer layer, Node context) {
-               // TODO make it more robust
-               for (String layerId : layers.keySet()) {
-                       SuiteLayer l = layers.get(layerId);
-                       if (layer == l) {
-                               return switchToLayer(layerId, context);
-                       }
-               }
-               throw new IllegalArgumentException("Layer is not registered.");
-       }
-
-       void addLayer(String id, SuiteLayer layer) {
-               layers.put(id, layer);
-       }
-
-       void removeLayer(String id) {
-               layers.remove(id);
-               if (workAreas.containsKey(id)) {
-                       Composite workArea = workAreas.remove(id);
-                       if (!workArea.isDisposed())
-                               workArea.dispose();
-               }
-       }
-
-       protected Composite initLayer(String id, SuiteLayer layer, Node context) {
-               Composite workArea = cmsView.doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
-               CmsUiUtils.style(workArea, SuiteStyle.workArea);
-               workArea.setLayoutData(CmsUiUtils.coverAll());
-               workAreas.put(id, workArea);
-               return workArea;
-       }
-
-       synchronized void logout() {
-               userDir = null;
-               Jcr.logout(sysSession);
-//             Jcr.logout(homeSession);
-               currentLayerId = null;
-               workAreas.clear();
-       }
-
-       /*
-        * GETTERS / SETTERS
-        */
-
-       Composite getHeader() {
-               return header;
-       }
-
-       Composite getFooter() {
-               return footer;
-       }
-
-       Composite getLeadPane() {
-               return leadPane;
-       }
-
-       Composite getBelowHeader() {
-               return belowHeader;
-       }
-
-//     Session getSysSession() {
-//             return sysSession;
-//     }
-//
-       synchronized void initSessions(Repository repository, String userDirPath) throws RepositoryException {
-               this.sysSession = repository.login();
-               this.homeSession = repository.login(NodeConstants.HOME_WORKSPACE);
-               userDir = sysSession.getNode(userDirPath);
-               addDisposeListener((e) -> {
-                       Jcr.logout(sysSession);
-                       Jcr.logout(homeSession);
-               });
-       }
-
-       Node getUserDir() {
-               return userDir;
-       }
-
-       Session getSysSession() {
-               return sysSession;
-       }
-
-       Session getSession(String workspaceName) {
-               if (workspaceName == null)
-                       return sysSession;
-               if (NodeConstants.SYS_WORKSPACE.equals(workspaceName))
-                       return sysSession;
-               else if (NodeConstants.HOME_WORKSPACE.equals(workspaceName))
-                       return homeSession;
-               else
-                       throw new IllegalArgumentException("Unknown workspace " + workspaceName);
-       }
-
-       public CmsView getCmsView() {
-               return cmsView;
-       }
-
-       public Localized getTitle() {
-               return title;
-       }
-
-       public void setTitle(Localized title) {
-               this.title = title;
-       }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/SuiteUiUtils.java
deleted file mode 100644 (file)
index 0cfee18..0000000
+++ /dev/null
@@ -1,386 +0,0 @@
-package org.argeo.suite.ui;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.argeo.cms.LocaleUtils;
-import org.argeo.cms.Localized;
-import org.argeo.cms.auth.CurrentUser;
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.dialogs.LightweightDialog;
-import org.argeo.cms.ui.util.CmsEvent;
-import org.argeo.cms.ui.util.CmsIcon;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.entity.EntityNames;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.suite.SuiteRole;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.service.event.Event;
-
-/** UI utilities related to the APAF project. */
-public class SuiteUiUtils {
-
-       /** Singleton. */
-       private SuiteUiUtils() {
-       }
-
-       /** creates a title bar composite with label and optional button */
-       public static void addTitleBar(Composite parent, String title, Boolean isEditable) {
-               Composite titleBar = new Composite(parent, SWT.NONE);
-               titleBar.setLayoutData(CmsUiUtils.fillWidth());
-               CmsUiUtils.style(titleBar, SuiteStyle.titleContainer);
-
-               titleBar.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(2, false)));
-               Label titleLbl = new Label(titleBar, SWT.NONE);
-               titleLbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
-               CmsUiUtils.style(titleLbl, SuiteStyle.titleLabel);
-               titleLbl.setText(title);
-
-               if (isEditable) {
-                       Button editBtn = new Button(titleBar, SWT.PUSH);
-                       editBtn.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
-                       CmsUiUtils.style(editBtn, SuiteStyle.inlineButton);
-                       editBtn.setText("Edit");
-               }
-       }
-
-       public static Label addFormLabel(Composite parent, String label) {
-               Label lbl = new Label(parent, SWT.WRAP);
-               lbl.setText(label);
-               // lbl.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, true, true));
-               CmsUiUtils.style(lbl, SuiteStyle.simpleLabel);
-               return lbl;
-       }
-
-       public static Text addFormTextField(Composite parent, String text, String message) {
-               return addFormTextField(parent, text, message, SWT.NONE);
-       }
-
-       public static Text addFormTextField(Composite parent, String text, String message, int style) {
-               Text txt = new Text(parent, style);
-               if (text != null)
-                       txt.setText(text);
-               if (message != null)
-                       txt.setMessage(message);
-               txt.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, true, true));
-               CmsUiUtils.style(txt, SuiteStyle.simpleText);
-               return txt;
-       }
-
-       public static Text addFormInputField(Composite parent, String placeholder) {
-               Text txt = new Text(parent, SWT.BORDER);
-
-               GridData gridData = CmsUiUtils.fillWidth();
-               txt.setLayoutData(gridData);
-
-               if (placeholder != null)
-                       txt.setText(placeholder);
-
-               CmsUiUtils.style(txt, SuiteStyle.simpleInput);
-               return txt;
-       }
-
-       /** creates a single horizontal-block composite for key:value display */
-       public static Text addFormLine(Composite parent, String label, String text) {
-               Composite lineComposite = new Composite(parent, SWT.NONE);
-               lineComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               lineComposite.setLayout(new GridLayout(2, false));
-               CmsUiUtils.style(lineComposite, SuiteStyle.formLine);
-               addFormLabel(lineComposite, label);
-               Text txt = addFormTextField(lineComposite, text, null);
-               txt.setEditable(false);
-               txt.setLayoutData(CmsUiUtils.fillWidth());
-               return txt;
-       }
-
-       public static Text addFormLine(Composite parent, String label, Node node, String property,
-                       CmsEditable cmsEditable) {
-               Composite lineComposite = new Composite(parent, SWT.NONE);
-               lineComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               lineComposite.setLayout(new GridLayout(2, false));
-               CmsUiUtils.style(lineComposite, SuiteStyle.formLine);
-               addFormLabel(lineComposite, label);
-               String text = Jcr.get(node, property);
-//             int style = cmsEditable.isEditing() ? SWT.WRAP : SWT.WRAP;
-               Text txt = addFormTextField(lineComposite, text, null, SWT.WRAP);
-               if (cmsEditable != null && cmsEditable.isEditing()) {
-                       txt.addModifyListener((e) -> {
-                               Jcr.set(node, property, txt.getText());
-                               Jcr.save(node);
-                       });
-               } else {
-                       txt.setEditable(false);
-               }
-               txt.setLayoutData(CmsUiUtils.fillWidth());
-               return txt;
-       }
-
-       public static Text addFormInput(Composite parent, String label, String placeholder) {
-               Composite lineComposite = new Composite(parent, SWT.NONE);
-               lineComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               lineComposite.setLayout(new GridLayout(2, false));
-               CmsUiUtils.style(lineComposite, SuiteStyle.formLine);
-               addFormLabel(lineComposite, label);
-               Text txt = addFormInputField(lineComposite, placeholder);
-               txt.setLayoutData(CmsUiUtils.fillWidth());
-               return txt;
-       }
-
-       /**
-        * creates a single horizontal-block composite for key:value display, with
-        * offset value
-        */
-       public static Text addFormLine(Composite parent, String label, String text, Integer offset) {
-               Composite lineComposite = new Composite(parent, SWT.NONE);
-               lineComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               lineComposite.setLayout(new GridLayout(3, false));
-               CmsUiUtils.style(lineComposite, SuiteStyle.formLine);
-               Label offsetLbl = new Label(lineComposite, SWT.NONE);
-               GridData gridData = new GridData();
-               gridData.widthHint = offset;
-               offsetLbl.setLayoutData(gridData);
-               addFormLabel(lineComposite, label);
-               Text txt = addFormTextField(lineComposite, text, null);
-               txt.setLayoutData(CmsUiUtils.fillWidth());
-               return txt;
-       }
-
-       /** creates a single vertical-block composite for key:value display */
-       public static Text addFormColumn(Composite parent, String label, String text) {
-//             Composite columnComposite = new Composite(parent, SWT.NONE);
-//             columnComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-//             columnComposite.setLayout(new GridLayout(1, false));
-               addFormLabel(parent, label);
-               Text txt = addFormTextField(parent, text, null);
-               txt.setEditable(false);
-               txt.setLayoutData(CmsUiUtils.fillWidth());
-               return txt;
-       }
-
-       public static Text addFormColumn(Composite parent, String label, Node node, String property,
-                       CmsEditable cmsEditable) {
-//             Composite columnComposite = new Composite(parent, SWT.NONE);
-//             columnComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-//             columnComposite.setLayout(new GridLayout(1, false));
-               addFormLabel(parent, label);
-               String text = Jcr.get(node, property);
-//             int style = cmsEditable.isEditing() ? SWT.WRAP : SWT.WRAP;
-               Text txt = addFormTextField(parent, text, null, SWT.WRAP);
-               if (cmsEditable != null && cmsEditable.isEditing()) {
-                       txt.addModifyListener((e) -> {
-                               Jcr.set(node, property, txt.getText());
-                               Jcr.save(node);
-                       });
-               } else {
-                       txt.setEditable(false);
-               }
-               txt.setLayoutData(CmsUiUtils.fillWidth());
-               return txt;
-       }
-
-       public static Label createBoldLabel(Composite parent, Localized localized) {
-               Label label = new Label(parent, SWT.LEAD);
-               label.setText(localized.lead());
-               label.setFont(EclipseUiUtils.getBoldFont(parent));
-               label.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
-               return label;
-       }
-
-       public static Label addFormPicture(Composite parent, String label, Node fileNode) throws RepositoryException {
-               Composite lineComposite = new Composite(parent, SWT.NONE);
-               lineComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               lineComposite.setLayout(new GridLayout(2, true));
-               CmsUiUtils.style(lineComposite, SuiteStyle.formLine);
-               addFormLabel(lineComposite, label);
-
-               return addPicture(lineComposite, fileNode);
-       }
-
-       public static Label addPicture(Composite parent, Node fileNode) throws RepositoryException {
-               return addPicture(parent, fileNode, null);
-       }
-
-       public static Label addPicture(Composite parent, Node fileNode, Integer maxWidth) throws RepositoryException {
-               Node content = fileNode.getNode(Node.JCR_CONTENT);
-               // TODO move it deeper in the middleware.
-               if (!content.isNodeType(EntityType.box.get())) {
-                       if (content.getSession().hasPermission(content.getPath(), Session.ACTION_SET_PROPERTY)) {
-                               try (InputStream in = JcrUtils.getFileAsStream(fileNode)) {
-                                       ImageData imageData = new ImageData(in);
-                                       content.addMixin(EntityType.box.get());
-                                       content.setProperty(EntityNames.SVG_WIDTH, imageData.width);
-                                       content.setProperty(EntityNames.SVG_HEIGHT, imageData.height);
-                                       content.getSession().save();
-                               } catch (IOException e) {
-                                       throw new RuntimeException(e);
-                               }
-                       }
-               }
-
-               // TODO optimise
-               Long width;
-               Long height;
-               if (content.isNodeType(EntityType.box.get())) {
-                       width = content.getProperty(EntityNames.SVG_WIDTH).getLong();
-                       height = content.getProperty(EntityNames.SVG_HEIGHT).getLong();
-               } else {
-                       try (InputStream in = JcrUtils.getFileAsStream(fileNode)) {
-                               ImageData imageData = new ImageData(in);
-                               width = Long.valueOf(imageData.width);
-                               height = Long.valueOf(imageData.height);
-                       } catch (IOException e) {
-                               throw new RuntimeException(e);
-                       }
-               }
-
-               if (maxWidth != null && width > maxWidth) {
-                       Double ratio = maxWidth.doubleValue() / width.doubleValue();
-                       width = maxWidth.longValue();
-                       height = Math.round(ratio * height);
-               }
-               Label img = new Label(parent, SWT.NONE);
-               CmsUiUtils.markup(img);
-               img.setText(CmsUiUtils.img(fileNode, width.toString(), height.toString()));
-               if (parent.getLayout() instanceof GridLayout) {
-                       GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
-                       gd.widthHint = width.intValue();
-                       gd.heightHint = height.intValue();
-                       img.setLayoutData(gd);
-               }
-               img.addMouseListener(new MouseListener() {
-                       private static final long serialVersionUID = -1362242049325206168L;
-
-                       @Override
-                       public void mouseUp(MouseEvent e) {
-                       }
-
-                       @Override
-                       public void mouseDown(MouseEvent e) {
-                       }
-
-                       @Override
-                       public void mouseDoubleClick(MouseEvent e) {
-                               LightweightDialog dialog = new LightweightDialog(img.getShell()) {
-
-                                       @Override
-                                       protected Control createDialogArea(Composite parent) {
-                                               parent.setLayout(new GridLayout());
-                                               ScrolledComposite scroll = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-                                               scroll.setLayoutData(CmsUiUtils.fillAll());
-                                               scroll.setLayout(CmsUiUtils.noSpaceGridLayout());
-                                               scroll.setExpandHorizontal(true);
-                                               scroll.setExpandVertical(true);
-                                               // scroll.setAlwaysShowScrollBars(true);
-
-                                               Composite c = new Composite(scroll, SWT.NONE);
-                                               scroll.setContent(c);
-                                               c.setLayout(new GridLayout());
-                                               c.setLayoutData(CmsUiUtils.fillAll());
-                                               Label bigImg = new Label(c, SWT.NONE);
-                                               CmsUiUtils.markup(bigImg);
-                                               bigImg.setText(CmsUiUtils.img(fileNode, Jcr.get(content, EntityNames.SVG_WIDTH),
-                                                               Jcr.get(content, EntityNames.SVG_HEIGHT)));
-                                               bigImg.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
-                                               return bigImg;
-                                       }
-
-                                       @Override
-                                       protected Point getInitialSize() {
-                                               Point shellSize = img.getShell().getSize();
-                                               return new Point(shellSize.x - 100, shellSize.y - 100);
-                                       }
-
-                               };
-                               dialog.open();
-                       }
-               });
-               return img;
-       }
-
-       public static boolean isCoworker(CmsView cmsView) {
-               boolean coworker = cmsView.doAs(() -> CurrentUser.isInRole(SuiteRole.coworker.dn()));
-               return coworker;
-       }
-
-       public static boolean isTopic(Event event, CmsEvent cmsEvent) {
-               return event.getTopic().equals(cmsEvent.topic());
-       }
-
-       public static Button createLayerButton(Composite parent, String layer, Localized msg, CmsIcon icon,
-                       ClassLoader l10nClassLoader) {
-               CmsTheme theme = CmsTheme.getCmsTheme(parent);
-               Button button = new Button(parent, SWT.PUSH);
-               CmsUiUtils.style(button, SuiteStyle.leadPane);
-               if (icon != null)
-                       button.setImage(icon.getBigIcon(theme));
-               button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false));
-               // button.setToolTipText(msg.lead());
-               if (msg != null) {
-                       Label lbl = new Label(parent, SWT.CENTER);
-                       CmsUiUtils.style(lbl, SuiteStyle.leadPane);
-                       String txt = LocaleUtils.lead(msg, l10nClassLoader);
-//                     String txt = msg.lead();
-                       lbl.setText(txt);
-                       lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
-               }
-               CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer);
-               return button;
-       }
-
-//     public static String createAndConfigureEntity(Shell shell, Session referenceSession, String mainMixin,
-//                     String... additionnalProps) {
-//
-//             Session tmpSession = null;
-//             Session mainSession = null;
-//             try {
-//                     // FIXME would not work if home is another physical workspace
-//                     tmpSession = referenceSession.getRepository().login(NodeConstants.HOME_WORKSPACE);
-//                     Node draftNode = null;
-//                     for (int i = 0; i < additionnalProps.length - 1; i += 2) {
-//                             draftNode.setProperty(additionnalProps[i], additionnalProps[i + 1]);
-//                     }
-//                     Wizard wizard = null;
-//                     CmsWizardDialog dialog = new CmsWizardDialog(shell, wizard);
-//                     // WizardDialog dialog = new WizardDialog(shell, wizard);
-//                     if (dialog.open() == Window.OK) {
-//                             String parentPath = null;// "/" + appService.getBaseRelPath(mainMixin);
-//                             // FIXME it should be possible to specify the workspace
-//                             mainSession = referenceSession.getRepository().login();
-//                             Node parent = mainSession.getNode(parentPath);
-//                             Node task = null;// appService.publishEntity(parent, mainMixin, draftNode);
-////                           task = appService.saveEntity(task, false);
-//                             referenceSession.refresh(true);
-//                             return task.getPath();
-//                     }
-//                     return null;
-//             } catch (RepositoryException e1) {
-//                     throw new JcrException(
-//                                     "Unable to create " + mainMixin + " entity with session " + referenceSession.toString(), e1);
-//             } finally {
-//                     JcrUtils.logoutQuietly(tmpSession);
-//                     JcrUtils.logoutQuietly(mainSession);
-//             }
-//     }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewPersonPage.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewPersonPage.java
deleted file mode 100644 (file)
index ddd4488..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.argeo.suite.ui.dialogs;
-
-import org.argeo.suite.ui.SuiteMsg;
-import org.argeo.suite.ui.SuiteUiUtils;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-public class NewPersonPage extends WizardPage {
-       private static final long serialVersionUID = -944349994177526468L;
-       protected Text lastNameTxt;
-       protected Text firstNameTxt;
-       protected Text emailTxt;
-
-       protected NewPersonPage(String pageName) {
-               super(pageName);
-               setTitle(SuiteMsg.personWizardPageTitle.lead());
-       }
-
-       @Override
-       public void createControl(Composite parent) {
-               parent.setLayout(new GridLayout(2, false));
-
-               // FirstName
-               SuiteUiUtils.createBoldLabel(parent, SuiteMsg.firstName);
-               firstNameTxt = new Text(parent, SWT.BORDER);
-               firstNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-               // LastName
-               SuiteUiUtils.createBoldLabel(parent, SuiteMsg.lastName);
-               lastNameTxt = new Text(parent, SWT.BORDER);
-               lastNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-               SuiteUiUtils.createBoldLabel(parent, SuiteMsg.email);
-               emailTxt = new Text(parent, SWT.BORDER);
-               emailTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-               ModifyListener ml = new ModifyListener() {
-                       private static final long serialVersionUID = -1628130380128946886L;
-
-                       @Override
-                       public void modifyText(ModifyEvent event) {
-                               getContainer().updateButtons();
-                       }
-               };
-
-               firstNameTxt.addModifyListener(ml);
-               lastNameTxt.addModifyListener(ml);
-               emailTxt.addModifyListener(ml);
-
-               // Don't forget this.
-               setControl(firstNameTxt);
-               firstNameTxt.setFocus();
-
-       }
-
-//     public void updateNode(Node node, PeopleService peopleService, ResourcesService resourcesService) {
-//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_LAST_NAME, PropertyType.STRING, lastNameTxt.getText());
-//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_FIRST_NAME, PropertyType.STRING,
-//                             firstNameTxt.getText());
-//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_DISPLAY_NAME, PropertyType.STRING,
-//                             firstNameTxt.getText() + " " + lastNameTxt.getText());
-//             String email = emailTxt.getText();
-//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_PRIMARY_EMAIL, PropertyType.STRING, email);
-//             PeopleJcrUtils.createEmail(resourcesService, peopleService, node, email, true, null, null);
-//     }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewPersonWizard.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewPersonWizard.java
deleted file mode 100644 (file)
index 9db5e04..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-package org.argeo.suite.ui.dialogs;
-
-import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
-
-import javax.jcr.Node;
-
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.suite.ui.SuiteMsg;
-import org.argeo.suite.ui.SuiteUiUtils;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/** Ask first & last name. Update the passed node on finish */
-public class NewPersonWizard extends Wizard {
-       // private final static Log log = LogFactory.getLog(NewPersonWizard.class);
-
-       // Context
-       private Node person;
-
-       // This page widgets
-       protected Text lastNameTxt;
-       protected Text firstNameTxt;
-       // private Button useDistinctDisplayNameBtn;
-       // private Text displayNameTxt;
-
-       public NewPersonWizard(Node person) {
-               this.person = person;
-       }
-
-       @Override
-       public void addPages() {
-               try {
-                       MainInfoPage page = new MainInfoPage("Main page");
-                       addPage(page);
-               } catch (Exception e) {
-                       throw new RuntimeException("Cannot add page to wizard", e);
-               }
-               setWindowTitle(SuiteMsg.personWizardWindowTitle.lead());
-       }
-
-       /**
-        * Called when the user click on 'Finish' in the wizard. The task is then
-        * created and the corresponding session saved.
-        */
-       @Override
-       public boolean performFinish() {
-               String lastName = lastNameTxt.getText();
-               String firstName = firstNameTxt.getText();
-               // String displayName = displayNameTxt.getText();
-               // boolean useDistinct = useDistinctDisplayNameBtn.getSelection();
-               if (EclipseUiUtils.isEmpty(lastName) && EclipseUiUtils.isEmpty(firstName)) {
-                       MessageDialog.openError(getShell(), "Non-valid information",
-                                       "Please enter at least a name that is not empty.");
-                       return false;
-               } else {
-//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_LAST_NAME, PropertyType.STRING, lastName);
-//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_FIRST_NAME, PropertyType.STRING, firstName);
-//                     String fullName = firstName + " " + lastName;
-//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_DISPLAY_NAME, PropertyType.STRING, fullName);
-                       return true;
-               }
-       }
-
-       @Override
-       public boolean performCancel() {
-               return true;
-       }
-
-       @Override
-       public boolean canFinish() {
-               String lastName = lastNameTxt.getText();
-               String firstName = firstNameTxt.getText();
-               if (isEmpty(lastName) && isEmpty(firstName)) {
-                       return false;
-               } else
-                       return true;
-       }
-
-       protected class MainInfoPage extends WizardPage {
-               private static final long serialVersionUID = 1L;
-
-               public MainInfoPage(String pageName) {
-                       super(pageName);
-                       setTitle(SuiteMsg.personWizardPageTitle.lead());
-                       // setMessage("Please enter a last name and/or a first name.");
-               }
-
-               public void createControl(Composite parent) {
-                       parent.setLayout(new GridLayout(2, false));
-
-                       // FirstName
-                       SuiteUiUtils.createBoldLabel(parent, SuiteMsg.firstName);
-                       firstNameTxt = new Text(parent, SWT.BORDER);
-                       // firstNameTxt.setMessage("a first name");
-                       firstNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-                       // LastName
-                       SuiteUiUtils.createBoldLabel(parent, SuiteMsg.lastName);
-                       lastNameTxt = new Text(parent, SWT.BORDER);
-                       // lastNameTxt.setMessage("a last name");
-                       lastNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-                       // Display Name
-                       // useDistinctDisplayNameBtn = new Button(parent, SWT.CHECK);
-                       // useDistinctDisplayNameBtn.setText("Define a disting display name");
-                       // useDistinctDisplayNameBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
-                       // true, false, 2, 1));
-                       //
-                       // ConnectWorkbenchUtils.createBoldLabel(parent, "Display Name");
-                       // displayNameTxt = new Text(parent, SWT.BORDER);
-                       // displayNameTxt.setMessage("an optional display name");
-                       // displayNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
-                       // false));
-                       // displayNameTxt.setEnabled(false);
-                       //
-                       // useDistinctDisplayNameBtn.addSelectionListener(new SelectionAdapter() {
-                       // private static final long serialVersionUID = 1L;
-                       //
-                       // @Override
-                       // public void widgetSelected(SelectionEvent e) {
-                       // displayNameTxt.setEnabled(useDistinctDisplayNameBtn.getSelection());
-                       // }
-                       // });
-
-                       ModifyListener ml = new ModifyListener() {
-                               private static final long serialVersionUID = -1628130380128946886L;
-
-                               @Override
-                               public void modifyText(ModifyEvent event) {
-                                       getContainer().updateButtons();
-                               }
-                       };
-
-                       firstNameTxt.addModifyListener(ml);
-                       lastNameTxt.addModifyListener(ml);
-                       // displayNameTxt.addModifyListener(ml);
-
-                       // Don't forget this.
-                       setControl(firstNameTxt);
-                       firstNameTxt.setFocus();
-               }
-       }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewUserWizard.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/dialogs/NewUserWizard.java
deleted file mode 100644 (file)
index 5b4575d..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-package org.argeo.suite.ui.dialogs;
-
-import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
-
-import javax.jcr.Node;
-
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.suite.ui.SuiteMsg;
-import org.argeo.suite.ui.SuiteUiUtils;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/** Ask first & last name. Update the passed node on finish */
-public class NewUserWizard extends Wizard {
-       // private final static Log log = LogFactory.getLog(NewPersonWizard.class);
-
-       // Context
-       private Node person;
-
-       // This page widgets
-       protected Text lastNameTxt;
-       protected Text firstNameTxt;
-       // private Button useDistinctDisplayNameBtn;
-       // private Text displayNameTxt;
-
-       public NewUserWizard(Node person) {
-               this.person = person;
-       }
-
-       @Override
-       public void addPages() {
-               try {
-                       MainInfoPage page = new MainInfoPage("Main page");
-                       addPage(page);
-               } catch (Exception e) {
-                       throw new RuntimeException("Cannot add page to wizard", e);
-               }
-               setWindowTitle(SuiteMsg.personWizardWindowTitle.lead());
-       }
-
-       /**
-        * Called when the user click on 'Finish' in the wizard. The task is then
-        * created and the corresponding session saved.
-        */
-       @Override
-       public boolean performFinish() {
-               String lastName = lastNameTxt.getText();
-               String firstName = firstNameTxt.getText();
-               // String displayName = displayNameTxt.getText();
-               // boolean useDistinct = useDistinctDisplayNameBtn.getSelection();
-               if (EclipseUiUtils.isEmpty(lastName) && EclipseUiUtils.isEmpty(firstName)) {
-                       MessageDialog.openError(getShell(), "Non-valid information",
-                                       "Please enter at least a name that is not empty.");
-                       return false;
-               } else {
-//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_LAST_NAME, PropertyType.STRING, lastName);
-//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_FIRST_NAME, PropertyType.STRING, firstName);
-//                     String fullName = firstName + " " + lastName;
-//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_DISPLAY_NAME, PropertyType.STRING, fullName);
-                       return true;
-               }
-       }
-
-       @Override
-       public boolean performCancel() {
-               return true;
-       }
-
-       @Override
-       public boolean canFinish() {
-               String lastName = lastNameTxt.getText();
-               String firstName = firstNameTxt.getText();
-               if (isEmpty(lastName) && isEmpty(firstName)) {
-                       return false;
-               } else
-                       return true;
-       }
-
-       protected class MainInfoPage extends WizardPage {
-               private static final long serialVersionUID = 1L;
-
-               public MainInfoPage(String pageName) {
-                       super(pageName);
-                       setTitle(SuiteMsg.personWizardPageTitle.lead());
-                       // setMessage("Please enter a last name and/or a first name.");
-               }
-
-               public void createControl(Composite parent) {
-                       parent.setLayout(new GridLayout(2, false));
-
-                       // FirstName
-                       SuiteUiUtils.createBoldLabel(parent, SuiteMsg.firstName);
-                       firstNameTxt = new Text(parent, SWT.BORDER);
-                       // firstNameTxt.setMessage("a first name");
-                       firstNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-                       // LastName
-                       SuiteUiUtils.createBoldLabel(parent, SuiteMsg.lastName);
-                       lastNameTxt = new Text(parent, SWT.BORDER);
-                       // lastNameTxt.setMessage("a last name");
-                       lastNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-                       // Display Name
-                       // useDistinctDisplayNameBtn = new Button(parent, SWT.CHECK);
-                       // useDistinctDisplayNameBtn.setText("Define a disting display name");
-                       // useDistinctDisplayNameBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
-                       // true, false, 2, 1));
-                       //
-                       // ConnectWorkbenchUtils.createBoldLabel(parent, "Display Name");
-                       // displayNameTxt = new Text(parent, SWT.BORDER);
-                       // displayNameTxt.setMessage("an optional display name");
-                       // displayNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
-                       // false));
-                       // displayNameTxt.setEnabled(false);
-                       //
-                       // useDistinctDisplayNameBtn.addSelectionListener(new SelectionAdapter() {
-                       // private static final long serialVersionUID = 1L;
-                       //
-                       // @Override
-                       // public void widgetSelected(SelectionEvent e) {
-                       // displayNameTxt.setEnabled(useDistinctDisplayNameBtn.getSelection());
-                       // }
-                       // });
-
-                       ModifyListener ml = new ModifyListener() {
-                               private static final long serialVersionUID = -1628130380128946886L;
-
-                               @Override
-                               public void modifyText(ModifyEvent event) {
-                                       getContainer().updateButtons();
-                               }
-                       };
-
-                       firstNameTxt.addModifyListener(ml);
-                       lastNameTxt.addModifyListener(ml);
-                       // displayNameTxt.addModifyListener(ml);
-
-                       // Don't forget this.
-                       setControl(firstNameTxt);
-                       firstNameTxt.setFocus();
-               }
-       }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/AbstractConnectContextMenu.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/AbstractConnectContextMenu.java
deleted file mode 100644 (file)
index 07f9cee..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.argeo.suite.ui.widgets;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Generic popup context menu for TableViewer to enable single sourcing between
- * CMS and Workbench
- */
-public abstract class AbstractConnectContextMenu {
-
-       private Shell parentShell;
-       private Shell shell;
-       // Local context
-
-       private final static String KEY_ACTION_ID = "actionId";
-       private final String[] defaultActions;
-       private Map<String, Button> actionButtons = new HashMap<String, Button>();
-
-       public AbstractConnectContextMenu(Display display, String[] defaultActions) {
-               parentShell = display.getActiveShell();
-               shell = new Shell(parentShell, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
-               this.defaultActions = defaultActions;
-       }
-
-       protected void createControl() {
-               shell.setLayout(EclipseUiUtils.noSpaceGridLayout());
-               Composite boxCmp = new Composite(shell, SWT.NO_FOCUS | SWT.BORDER);
-               boxCmp.setLayout(EclipseUiUtils.noSpaceGridLayout());
-//             CmsUiUtils.style(boxCmp, ConnectUiStyles.CONTEXT_MENU_BOX);
-               createContextMenu(boxCmp);
-               shell.addShellListener(new ActionsShellListener());
-       }
-
-       protected void createContextMenu(Composite boxCmp) {
-               ActionsSelListener asl = new ActionsSelListener();
-               for (String actionId : defaultActions) {
-                       Button btn = new Button(boxCmp, SWT.FLAT | SWT.LEAD);
-                       btn.setText(getLabel(actionId));
-                       btn.setLayoutData(EclipseUiUtils.fillWidth());
-                       CmsUiUtils.markup(btn);
-//                     CmsUiUtils.style(btn, actionId + ConnectUiStyles.BUTTON_SUFFIX);
-                       btn.setData(KEY_ACTION_ID, actionId);
-                       btn.addSelectionListener(asl);
-                       actionButtons.put(actionId, btn);
-               }
-       }
-
-       protected void setVisible(boolean visible, String... buttonIds) {
-               for (String id : buttonIds) {
-                       Button button = actionButtons.get(id);
-                       button.setVisible(visible);
-                       GridData gd = (GridData) button.getLayoutData();
-                       gd.heightHint = visible ? SWT.DEFAULT : 0;
-               }
-       }
-
-       public void show(Control source, Point location, IStructuredSelection selection) {
-               if (shell.isDisposed()) {
-                       shell = new Shell(Display.getCurrent(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
-                       createControl();
-               }
-               if (shell.isVisible())
-                       shell.setVisible(false);
-
-               if (aboutToShow(source, location, selection)) {
-                       shell.pack();
-                       shell.layout();
-                       if (source instanceof Control)
-                               shell.setLocation(((Control) source).toDisplay(location.x, location.y));
-                       shell.open();
-               }
-       }
-
-       protected Shell getParentShell() {
-               return parentShell;
-       }
-
-       class StyleButton extends Label {
-               private static final long serialVersionUID = 7731102609123946115L;
-
-               public StyleButton(Composite parent, int swtStyle) {
-                       super(parent, swtStyle);
-               }
-       }
-
-       class ActionsSelListener extends SelectionAdapter {
-               private static final long serialVersionUID = -1041871937815812149L;
-
-               @Override
-               public void widgetSelected(SelectionEvent e) {
-                       Object eventSource = e.getSource();
-                       if (eventSource instanceof Button) {
-                               Button pressedBtn = (Button) eventSource;
-                               performAction((String) pressedBtn.getData(KEY_ACTION_ID));
-                               shell.close();
-                       }
-               }
-       }
-
-       class ActionsShellListener extends org.eclipse.swt.events.ShellAdapter {
-               private static final long serialVersionUID = -5092341449523150827L;
-
-               @Override
-               public void shellDeactivated(ShellEvent e) {
-                       setVisible(false);
-                       shell.setVisible(false);
-                       //shell.close();
-               }
-       }
-
-       protected abstract boolean performAction(String actionId);
-
-       protected abstract boolean aboutToShow(Control source, Point location, IStructuredSelection selection);
-
-       protected abstract String getLabel(String actionId);
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/ConnectAbstractDropDown.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/ConnectAbstractDropDown.java
deleted file mode 100644 (file)
index ffe733e..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-package org.argeo.suite.ui.widgets;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.eclipse.rap.rwt.widgets.DropDown;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-
-/**
- * Enable easy addition of a {@code DropDown} widget to a text with listeners
- * configured
- */
-public abstract class ConnectAbstractDropDown {
-
-       private final Text text;
-       private final DropDown dropDown;
-       private boolean modifyFromList = false;
-
-       // Current displayed text
-       private String userText = "";
-       // Current displayed list items
-       private String[] values;
-
-       // Fine tuning
-       boolean readOnly;
-       boolean refreshOnFocus;
-
-       /** Implementing classes should call refreshValues() after initialisation */
-       public ConnectAbstractDropDown(Text text) {
-               this(text, SWT.NONE, false);
-       }
-
-       /**
-        * Implementing classes should call refreshValues() after initialisation
-        * 
-        * @param text
-        * @param style
-        *            only SWT.READ_ONLY is understood, check if the entered text is
-        *            part of the legal choices.
-        */
-       public ConnectAbstractDropDown(Text text, int style) {
-               this(text, style, false);
-       }
-
-       /**
-        * Implementers should call refreshValues() once init has been done.
-        * 
-        * @param text
-        * @param style
-        *            only SWT.READ_ONLY is understood, check if the entered text is
-        *            part of the legal choices.
-        * @param refreshOnFocus
-        *            if true, the possible values are computed each time the focus is
-        *            gained. It enables, among other to fine tune the getFilteredValues
-        *            method depending on the current context
-        */
-       public ConnectAbstractDropDown(Text text, int style, boolean refreshOnFocus) {
-               this.text = text;
-               dropDown = new DropDown(text);
-               Object obj = dropDown;
-               if (obj instanceof Widget)
-                       CmsUiUtils.markup((Widget) obj);
-               readOnly = (style & SWT.READ_ONLY) != 0;
-               this.refreshOnFocus = refreshOnFocus;
-               addListeners();
-       }
-
-       /**
-        * Overwrite to force the refresh of the possible values on focus gained event
-        */
-       protected boolean refreshOnFocus() {
-               return refreshOnFocus;
-       }
-
-       public String getText() {
-               return text.getText();
-       }
-
-       public void init() {
-               refreshValues();
-       }
-
-       public void reset(String value) {
-               modifyFromList = true;
-               if (EclipseUiUtils.notEmpty(value))
-                       text.setText(value);
-               else
-                       text.setText("");
-               refreshValues();
-               modifyFromList = false;
-       }
-
-       /** Overwrite to provide specific filtering */
-       protected abstract List<String> getFilteredValues(String filter);
-
-       protected void refreshValues() {
-               List<String> filteredValues = getFilteredValues(text.getText());
-               values = filteredValues.toArray(new String[filteredValues.size()]);
-               dropDown.setItems(values);
-       }
-
-       protected void addListeners() {
-               addModifyListener();
-               addSelectionListener();
-               addDefaultSelectionListener();
-               addFocusListener();
-       }
-
-       protected void addFocusListener() {
-               text.addFocusListener(new FocusListener() {
-                       private static final long serialVersionUID = -7179112097626535946L;
-
-                       public void focusGained(FocusEvent event) {
-                               if (refreshOnFocus) {
-                                       modifyFromList = true;
-                                       refreshValues();
-                                       modifyFromList = false;
-                               }
-                               dropDown.setVisible(true);
-                       }
-
-                       public void focusLost(FocusEvent event) {
-                               dropDown.setVisible(false);
-                               if (readOnly && values != null && !Arrays.asList(values).contains(userText)) {
-                                       modifyFromList = true;
-                                       text.setText("");
-                                       refreshValues();
-                                       modifyFromList = false;
-                               }
-                       }
-               });
-       }
-
-       private void addSelectionListener() {
-               Object obj = dropDown;
-               if (obj instanceof Widget)
-                       ((Widget) obj).addListener(SWT.Selection, new Listener() {
-                               private static final long serialVersionUID = -2357157809365135142L;
-
-                               public void handleEvent(Event event) {
-                                       if (event.index != -1) {
-                                               modifyFromList = true;
-                                               text.setText(values[event.index]);
-                                               modifyFromList = false;
-                                               text.selectAll();
-                                       } else {
-                                               text.setText(userText);
-                                               text.setSelection(userText.length(), userText.length());
-                                               text.setFocus();
-                                       }
-                               }
-                       });
-       }
-
-       private void addDefaultSelectionListener() {
-               Object obj = dropDown;
-               if (obj instanceof Widget)
-                       ((Widget) obj).addListener(SWT.DefaultSelection, new Listener() {
-                               private static final long serialVersionUID = -5958008322630466068L;
-
-                               public void handleEvent(Event event) {
-                                       if (event.index != -1) {
-                                               text.setText(values[event.index]);
-                                               text.setSelection(event.text.length());
-                                               dropDown.setVisible(false);
-                                       }
-                               }
-                       });
-       }
-
-       private void addModifyListener() {
-               text.addListener(SWT.Modify, new Listener() {
-                       private static final long serialVersionUID = -4373972835244263346L;
-
-                       public void handleEvent(Event event) {
-                               if (!modifyFromList) {
-                                       userText = text.getText();
-                                       refreshValues();
-                                       if (values.length == 1)
-                                               dropDown.setSelectionIndex(0);
-                                       dropDown.setVisible(true);
-                               }
-                       }
-               });
-       }
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/DelayedText.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/DelayedText.java
deleted file mode 100644 (file)
index a03c250..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-package org.argeo.suite.ui.widgets;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-import org.eclipse.rap.rwt.service.ServerPushSession;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Text that introduce a timer in the attached ModifyListener.
- * 
- * Note that corresponding ModifyEvent will *NOT* be sent in the UI thread.
- * Calling ModifierInstance must be implemented in consequence. Note also that
- * this delayed text only manages one listener at a time.
- *
- */
-public class DelayedText {
-       final int delay;
-       private Object lock = new Object();
-       private MyTimer timer = new MyTimer(DelayedText.this.toString());
-       private ModifyListener delayedModifyListener;
-       private ServerPushSession pushSession;
-
-       private Text text;
-
-       private ModifyListener modifyListener = new ModifyListener() {
-               private static final long serialVersionUID = 1117506414462641980L;
-
-               public void modifyText(ModifyEvent e) {
-                       ModifyEvent delayedEvent = null;
-                       synchronized (lock) {
-                               if (delayedModifyListener != null) {
-                                       Event tmpEvent = new Event();
-                                       tmpEvent.widget = text;
-                                       tmpEvent.display = e.display;
-                                       tmpEvent.data = e.data;
-                                       tmpEvent.time = e.time;
-                                       delayedEvent = new ModifyEvent(tmpEvent);
-                               }
-                       }
-                       final ModifyEvent timerModifyEvent = delayedEvent;
-
-                       synchronized (timer) {
-                               if (timer.timerTask != null) {
-                                       timer.timerTask.cancel();
-                                       timer.timerTask = null;
-                               }
-
-                               if (delayedEvent != null) {
-                                       timer.timerTask = new TimerTask() {
-                                               public void run() {
-                                                       synchronized (lock) {
-                                                               delayedModifyListener.modifyText(timerModifyEvent);
-                                                               // Bad approach: it is not a good idea to put a
-                                                               // display.asyncExec in a lock...
-                                                               // DelayedText.this.getDisplay().asyncExec(new
-                                                               // Runnable() {
-                                                               // @Override
-                                                               // public void run() {
-                                                               // delayedModifyListener.modifyText(timerModifyEvent);
-                                                               // }
-                                                               // }
-                                                               // );
-                                                       }
-                                                       synchronized (timer) {
-                                                               timer.timerTask = null;
-                                                       }
-                                               }
-                                       };
-                                       timer.schedule(timer.timerTask, delay);
-                                       if (pushSession != null)
-                                               pushSession.start();
-                               }
-                       }
-               };
-       };
-
-       public DelayedText(Composite parent, int style, int delayInMs) {
-               // super(parent, style);
-               text = new Text(parent, style);
-               this.delay = delayInMs;
-               text.addModifyListener(modifyListener);
-       }
-
-       /**
-        * Adds a modify text listener that will be delayed. If another Modify event
-        * happens during the waiting delay, the older event will be canceled an a new
-        * one will be scheduled after another new delay.
-        */
-       public void addDelayedModifyListener(ServerPushSession pushSession, ModifyListener listener) {
-               synchronized (lock) {
-                       delayedModifyListener = listener;
-                       this.pushSession = pushSession;
-               }
-       }
-
-       public void removeDelayedModifyListener(ModifyListener listener) {
-               synchronized (lock) {
-                       delayedModifyListener = null;
-                       pushSession = null;
-               }
-       }
-
-       private class MyTimer extends Timer {
-               private TimerTask timerTask = null;
-
-               public MyTimer(String name) {
-                       super(name);
-               }
-       }
-
-       public Text getText() {
-               return text;
-       }
-
-       public void close() {
-               if (pushSession != null)
-                       pushSession.stop();
-               if (timer != null)
-                       timer.cancel();
-       };
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TabbedArea.java
deleted file mode 100644 (file)
index 8ce5fed..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-package org.argeo.suite.ui.widgets;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.eclipse.ui.Selected;
-import org.argeo.jcr.Jcr;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/** Manages {@link Section} in a tab-like structure. */
-public class TabbedArea extends Composite {
-       private static final long serialVersionUID = 8659669229482033444L;
-
-       private Composite headers;
-       private Composite body;
-
-       private List<Section> sections = new ArrayList<>();
-
-       private Node previousNode;
-       private CmsUiProvider previousUiProvider;
-       private CmsUiProvider currentUiProvider;
-
-       private String tabStyle;
-       private String tabSelectedStyle;
-       private String bodyStyle;
-       private Image closeIcon;
-
-       private StackLayout stackLayout;
-
-       private boolean singleTab = false;
-
-       public TabbedArea(Composite parent, int style) {
-               super(parent, style);
-               CmsUiUtils.style(parent, bodyStyle);
-
-               setLayout(CmsUiUtils.noSpaceGridLayout());
-
-               // TODO manage tabs at bottom or sides
-               headers = new Composite(this, SWT.NONE);
-               headers.setLayoutData(CmsUiUtils.fillWidth());
-               body = new Composite(this, SWT.NONE);
-               body.setLayoutData(CmsUiUtils.fillAll());
-               // body.setLayout(new FormLayout());
-               stackLayout = new StackLayout();
-               body.setLayout(stackLayout);
-               emptyState();
-       }
-
-       protected void refreshTabHeaders() {
-               int tabCount = sections.size() > 0 ? sections.size() : 1;
-               for (Control tab : headers.getChildren())
-                       tab.dispose();
-
-               headers.setLayout(CmsUiUtils.noSpaceGridLayout(new GridLayout(tabCount, true)));
-
-               if (sections.size() == 0) {
-                       Composite emptyHeader = new Composite(headers, SWT.NONE);
-                       emptyHeader.setLayoutData(CmsUiUtils.fillAll());
-                       emptyHeader.setLayout(new GridLayout());
-                       Label lbl = new Label(emptyHeader, SWT.NONE);
-                       lbl.setText("");
-                       lbl.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false));
-
-               }
-
-               Section currentSection = getCurrentSection();
-               for (Section section : sections) {
-                       boolean selected = section == currentSection;
-                       Composite sectionHeader = section.createHeader(headers);
-                       CmsUiUtils.style(sectionHeader, selected ? tabSelectedStyle : tabStyle);
-                       int headerColumns = singleTab ? 1 : 2;
-                       sectionHeader.setLayout(new GridLayout(headerColumns, false));
-                       sectionHeader.setLayout(CmsUiUtils.noSpaceGridLayout(headerColumns));
-                       Button title = new Button(sectionHeader, SWT.FLAT);
-                       CmsUiUtils.style(title, selected ? tabSelectedStyle : tabStyle);
-                       title.setLayoutData(CmsUiUtils.fillWidth());
-                       title.addSelectionListener((Selected) (e) -> showTab(tabIndex(section.getNode())));
-                       Node node = section.getNode();
-                       String titleStr = Jcr.getTitle(node);
-                       // TODO internationalize
-                       title.setText(titleStr);
-                       if (!singleTab) {
-                               ToolBar toolBar = new ToolBar(sectionHeader, SWT.NONE);
-                               ToolItem closeItem = new ToolItem(toolBar, SWT.FLAT);
-                               if (closeIcon != null)
-                                       closeItem.setImage(closeIcon);
-                               else
-                                       closeItem.setText("X");
-                               CmsUiUtils.style(closeItem, selected ? tabSelectedStyle : tabStyle);
-                               closeItem.addSelectionListener((Selected) (e) -> closeTab(section));
-                       }
-               }
-
-       }
-
-       public void view(CmsUiProvider uiProvider, Node context) {
-               if (body.isDisposed())
-                       return;
-               int index = tabIndex(context);
-               if (index >= 0) {
-                       showTab(index);
-                       previousNode = context;
-                       previousUiProvider = uiProvider;
-                       return;
-               }
-               Section section = (Section) body.getChildren()[0];
-               previousNode = section.getNode();
-               if (previousNode == null) {// empty state
-                       previousNode = context;
-                       previousUiProvider = uiProvider;
-               } else {
-                       previousUiProvider = currentUiProvider;
-               }
-               currentUiProvider = uiProvider;
-               section.setNode(context);
-               // section.setLayoutData(CmsUiUtils.coverAll());
-               build(section, uiProvider, context);
-               if (sections.size() == 0)
-                       sections.add(section);
-               refreshTabHeaders();
-               index = tabIndex(context);
-               showTab(index);
-               layout(true, true);
-       }
-
-       public void open(CmsUiProvider uiProvider, Node context) {
-               if (singleTab)
-                       throw new UnsupportedOperationException("Open is not supported in single tab mode.");
-
-               if (previousNode != null && Jcr.getIdentifier(previousNode).equals(Jcr.getIdentifier(context))) {
-                       // does nothing
-                       return;
-               }
-               if (sections.size() == 0)
-                       CmsUiUtils.clear(body);
-               Section currentSection = getCurrentSection();
-               int currentIndex = sections.indexOf(currentSection);
-               Section previousSection = new Section(body, SWT.NONE, context);
-               build(previousSection, previousUiProvider, previousNode);
-               // previousSection.setLayoutData(CmsUiUtils.coverAll());
-               int index = currentIndex + 1;
-               sections.add(index, previousSection);
-               showTab(index);
-               refreshTabHeaders();
-               layout(true, true);
-       }
-
-       public void showTab(int index) {
-               Section sectionToShow = sections.get(index);
-               // sectionToShow.moveAbove(null);
-               stackLayout.topControl = sectionToShow;
-               refreshTabHeaders();
-               layout(true, true);
-       }
-
-       protected void build(Section section, CmsUiProvider uiProvider, Node context) {
-               for (Control child : section.getChildren())
-                       child.dispose();
-               CmsUiUtils.style(section, bodyStyle);
-               section.setNode(context);
-               uiProvider.createUiPart(section, context);
-
-       }
-
-       private int tabIndex(Node node) {
-               for (int i = 0; i < sections.size(); i++) {
-                       Section section = sections.get(i);
-                       if (Jcr.getIdentifier(section.getNode()).equals(Jcr.getIdentifier(node)))
-                               return i;
-               }
-               return -1;
-       }
-
-       public void closeTab(Section section) {
-               int currentIndex = sections.indexOf(section);
-               int nextIndex = currentIndex == 0 ? 0 : currentIndex - 1;
-               sections.remove(section);
-               section.dispose();
-               if (sections.size() == 0) {
-                       emptyState();
-                       refreshTabHeaders();
-                       layout(true, true);
-                       return;
-               }
-               refreshTabHeaders();
-               showTab(nextIndex);
-       }
-
-       protected void emptyState() {
-               new Section(body, SWT.NONE, null);
-               refreshTabHeaders();
-       }
-
-       public Composite getCurrent() {
-               return getCurrentSection();
-       }
-
-       protected Section getCurrentSection() {
-               return (Section) stackLayout.topControl;
-       }
-
-       public void setTabStyle(String tabStyle) {
-               this.tabStyle = tabStyle;
-       }
-
-       public void setTabSelectedStyle(String tabSelectedStyle) {
-               this.tabSelectedStyle = tabSelectedStyle;
-       }
-
-       public void setBodyStyle(String bodyStyle) {
-               this.bodyStyle = bodyStyle;
-       }
-
-       public void setCloseIcon(Image closeIcon) {
-               this.closeIcon = closeIcon;
-       }
-
-       public void setSingleTab(boolean singleTab) {
-               this.singleTab = singleTab;
-       }
-
-}
diff --git a/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TreeOrSearchArea.java b/core/org.argeo.suite.ui/src/org/argeo/suite/ui/widgets/TreeOrSearchArea.java
deleted file mode 100644 (file)
index 3434ed5..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.argeo.suite.ui.widgets;
-
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Displays a tree by default, which becomes a list if the search text field is
- * used.
- */
-public class TreeOrSearchArea extends Composite {
-       private static final long serialVersionUID = -1302546480076719532L;
-
-       private Text searchT;
-       private StackLayout bodyLayout;
-
-       private TreeViewer treeViewer;
-       private TreeViewer searchResultsViewer;
-
-       public TreeOrSearchArea(Composite parent, int style) {
-               super(parent, style);
-               createUi(this);
-       }
-
-       protected void createUi(Composite parent) {
-               parent.setLayout(new GridLayout());
-               Composite searchC = new Composite(parent, SWT.NONE);
-               searchC.setLayout(new GridLayout());
-               searchC.setLayoutData(CmsUiUtils.fillWidth());
-               createSearchUi(searchC);
-
-               Composite bodyC = new Composite(parent, SWT.NONE);
-               bodyC.setLayoutData(CmsUiUtils.fillAll());
-               bodyLayout = new StackLayout();
-               bodyC.setLayout(bodyLayout);
-               Composite treeC = new Composite(bodyC, SWT.NONE);
-               createTreeUi(treeC);
-               Composite searchResultsC = new Composite(bodyC, SWT.NONE);
-               createSearchResultsUi(searchResultsC);
-
-               bodyLayout.topControl = treeC;
-       }
-
-       protected void createSearchUi(Composite parent) {
-               parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-               searchT = new Text(parent, SWT.MULTI | SWT.BORDER);
-               searchT.setLayoutData(CmsUiUtils.fillWidth());
-       }
-
-       protected void createTreeUi(Composite parent) {
-               parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-               treeViewer = new TreeViewer(parent);
-               treeViewer.getTree().setLayoutData(CmsUiUtils.fillAll());
-       }
-
-       protected void createSearchResultsUi(Composite parent) {
-               parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-               searchResultsViewer = new TreeViewer(parent);
-               searchResultsViewer.getTree().setLayoutData(CmsUiUtils.fillAll());
-       }
-
-       public TreeViewer getTreeViewer() {
-               return treeViewer;
-       }
-
-       public TreeViewer getSearchResultsViewer() {
-               return searchResultsViewer;
-       }
-
-}
diff --git a/core/pom.xml b/core/pom.xml
deleted file mode 100644 (file)
index a8ef5a0..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>core</artifactId>
-       <name>Argeo Core Components</name>
-       <packaging>pom</packaging>
-       <modules>
-               <!-- Entity Framework -->
-               <module>org.argeo.entity.api</module>
-               <module>org.argeo.entity.core</module>
-               <module>org.argeo.entity.ui</module>
-
-               <!-- Argeo Suite -->
-               <module>org.argeo.suite.core</module>
-               <module>org.argeo.suite.ui</module>
-               <module>org.argeo.suite.ui.rap</module>
-               <module>org.argeo.suite.theme.default</module>
-       </modules>
-</project>
diff --git a/dep/.gitignore b/dep/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/dep/org.argeo.suite.dep.e4.rap/.gitignore b/dep/org.argeo.suite.dep.e4.rap/.gitignore
deleted file mode 100644 (file)
index 76df179..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/target/
-/*.target
diff --git a/dep/org.argeo.suite.dep.e4.rap/META-INF/.gitignore b/dep/org.argeo.suite.dep.e4.rap/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/dep/org.argeo.suite.dep.e4.rap/bnd.bnd b/dep/org.argeo.suite.dep.e4.rap/bnd.bnd
deleted file mode 100644 (file)
index 991aa1a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-    
\ No newline at end of file
diff --git a/dep/org.argeo.suite.dep.e4.rap/p2.inf b/dep/org.argeo.suite.dep.e4.rap/p2.inf
deleted file mode 100644 (file)
index 0423aa5..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-properties.1.name=org.eclipse.equinox.p2.type.category
-properties.1.value=true
\ No newline at end of file
diff --git a/dep/org.argeo.suite.dep.e4.rap/pom.xml b/dep/org.argeo.suite.dep.e4.rap/pom.xml
deleted file mode 100644 (file)
index 30ff3b6..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>dep</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.suite.dep.e4.rap</artifactId>
-       <name>Suite Platform E4 RAP</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <!-- Argeo Suite UI -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.dep.ui.rap</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-                       <type>pom</type>
-               </dependency>
-
-
-               <!-- Base CMS distribution -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.dep.cms.e4.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <type>pom</type>
-               </dependency>
-
-               <!-- Argeo TP Extras -->
-               <!-- <dependency> -->
-               <!-- <groupId>org.argeo.tp.payment</groupId> -->
-               <!-- <artifactId>com.stripe</artifactId> -->
-               <!-- </dependency> -->
-
-       </dependencies>
-</project>
diff --git a/dep/org.argeo.suite.dep.e4.rcp/.gitignore b/dep/org.argeo.suite.dep.e4.rcp/.gitignore
deleted file mode 100644 (file)
index 76df179..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/target/
-/*.target
diff --git a/dep/org.argeo.suite.dep.e4.rcp/META-INF/.gitignore b/dep/org.argeo.suite.dep.e4.rcp/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/dep/org.argeo.suite.dep.e4.rcp/bnd.bnd b/dep/org.argeo.suite.dep.e4.rcp/bnd.bnd
deleted file mode 100644 (file)
index 991aa1a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-    
\ No newline at end of file
diff --git a/dep/org.argeo.suite.dep.e4.rcp/p2.inf b/dep/org.argeo.suite.dep.e4.rcp/p2.inf
deleted file mode 100644 (file)
index 0423aa5..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-properties.1.name=org.eclipse.equinox.p2.type.category
-properties.1.value=true
\ No newline at end of file
diff --git a/dep/org.argeo.suite.dep.e4.rcp/pom.xml b/dep/org.argeo.suite.dep.e4.rcp/pom.xml
deleted file mode 100644 (file)
index 57e5b2b..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>dep</artifactId>
-               <version>2.1.16-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.suite.dep.e4.rcp</artifactId>
-       <name>Suite E4 Platform RCP</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <!-- Base Argeo platform distribution -->
-               <dependency>
-                       <groupId>org.argeo.slc.rcp</groupId>
-                       <artifactId>org.argeo.dep.cms.e4.rcp</artifactId>
-                       <version>${version.argeo-slc}</version>
-                       <type>pom</type>
-               </dependency>
-
-               <!-- Argeo TP Extras -->
-<!--           <dependency> -->
-<!--                   <groupId>org.argeo.tp.payment</groupId> -->
-<!--                   <artifactId>com.stripe</artifactId> -->
-<!--           </dependency> -->
-
-       </dependencies>
-       <profiles>
-               <profile>
-                       <id>rpmbuild</id>
-                       <build>
-                               <plugins>
-                                       <plugin>
-                                               <artifactId>maven-assembly-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>prepare-source</id>
-                                                               <phase>package</phase>
-                                                               <goals>
-                                                                       <goal>single</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <descriptorRefs>
-                                                                               <descriptorRef>a2-source</descriptorRef>
-                                                                       </descriptorRefs>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                                       <!-- <plugin> -->
-                                       <!-- <groupId>org.apache.maven.plugins</groupId> -->
-                                       <!-- <artifactId>maven-dependency-plugin</artifactId> -->
-                                       <!-- <executions> -->
-                                       <!-- <execution> -->
-                                       <!-- <id>copy-argeo</id> -->
-                                       <!-- <phase>package</phase> -->
-                                       <!-- <goals> -->
-                                       <!-- <goal>copy-dependencies</goal> -->
-                                       <!-- </goals> -->
-                                       <!-- <configuration> -->
-                                       <!-- <includeTypes>jar</includeTypes> -->
-                                       <!-- <outputDirectory>${project.build.directory}/lib-argeo</outputDirectory> -->
-                                       <!-- <includeGroupIds>org.argeo.suite</includeGroupIds> -->
-                                       <!-- <includeTypes>jar</includeTypes> -->
-                                       <!-- <includeScope>runtime</includeScope> -->
-                                       <!-- <useRepositoryLayout>true</useRepositoryLayout> -->
-                                       <!-- </configuration> -->
-                                       <!-- </execution> -->
-                                       <!-- </executions> -->
-                                       <!-- </plugin> -->
-                                       <plugin>
-                                               <groupId>org.codehaus.mojo</groupId>
-                                               <artifactId>rpm-maven-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>rpm-argeo</id>
-                                                               <phase>package</phase>
-                                                               <goals>
-                                                                       <goal>rpm</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <name>argeo-suite-e4-rcp</name>
-                                                                       <mappings>
-                                                                               <mapping>
-                                                                                       <directory>/usr/share/osgi</directory>
-                                                                                       <username>root</username>
-                                                                                       <groupname>root</groupname>
-                                                                                       <filemode>644</filemode>
-                                                                                       <directoryIncluded>true</directoryIncluded>
-                                                                                       <sources>
-                                                                                               <source>
-                                                                                                       <location>${project.build.directory}/${project.artifactId}-${project.version}-a2-source</location>
-                                                                                                       <includes>
-                                                                                                               <include>**/*.jar</include>
-                                                                                                       </includes>
-                                                                                               </source>
-                                                                                       </sources>
-                                                                               </mapping>
-                                                                       </mappings>
-                                                                       <requires>
-                                                                               <require>argeo-cms-e4-rcp</require>
-                                                                               <require>argeo-connect-tp</require>
-                                                                       </requires>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                               </plugins>
-                       </build>
-               </profile>
-       </profiles>
-</project>
diff --git a/dep/org.argeo.suite.dep.ui.rap/.gitignore b/dep/org.argeo.suite.dep.ui.rap/.gitignore
deleted file mode 100644 (file)
index 76df179..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/target/
-/*.target
diff --git a/dep/org.argeo.suite.dep.ui.rap/META-INF/.gitignore b/dep/org.argeo.suite.dep.ui.rap/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/dep/org.argeo.suite.dep.ui.rap/bnd.bnd b/dep/org.argeo.suite.dep.ui.rap/bnd.bnd
deleted file mode 100644 (file)
index 991aa1a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-    
\ No newline at end of file
diff --git a/dep/org.argeo.suite.dep.ui.rap/p2.inf b/dep/org.argeo.suite.dep.ui.rap/p2.inf
deleted file mode 100644 (file)
index 0423aa5..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-properties.1.name=org.eclipse.equinox.p2.type.category
-properties.1.value=true
\ No newline at end of file
diff --git a/dep/org.argeo.suite.dep.ui.rap/pom.xml b/dep/org.argeo.suite.dep.ui.rap/pom.xml
deleted file mode 100644 (file)
index d94c609..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>dep</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.suite.dep.ui.rap</artifactId>
-       <name>Suite Platform UI RAP</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <!-- Entity Framework -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.entity.api</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.entity.core</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.entity.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Suite Icons -->
-               <dependency>
-                       <groupId>org.argeo.suite.icons</groupId>
-                       <artifactId>org.argeo.suite.icons.default</artifactId>
-                       <version>${version.argeo-suite-icons}</version>
-               </dependency>
-
-               <!-- Argeo Suite -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.core</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.theme.default</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.ui.rap</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo People -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.people.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Library -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.library.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Environment -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.geo.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Publishing -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.publishing.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Argeo Knowledge -->
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.support.xforms</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.support.odk</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.support.geonames</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Additional Third Parties -->
-               <dependency>
-                       <groupId>org.argeo.tp.javax</groupId>
-                       <artifactId>javax.xml.bind</artifactId>
-               </dependency>
-
-               <!-- Jackson JSON processor -->
-               <dependency>
-                       <groupId>org.argeo.tp.jackson</groupId>
-                       <artifactId>com.fasterxml.jackson.core.jackson-core</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.jackson</groupId>
-                       <artifactId>com.fasterxml.jackson.core.jackson-databind</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.jackson</groupId>
-                       <artifactId>com.fasterxml.jackson.core.jackson-annotations</artifactId>
-               </dependency>
-
-               <!-- PDFBox -->
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.pdfbox</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.pdfbox.fontbox</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.pdfbox.jempbox</artifactId>
-               </dependency>
-
-               <!-- POI requirements -->
-               <dependency>
-                       <groupId>org.argeo.tp.apache.commons</groupId>
-                       <artifactId>org.apache.commons.math3</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache.commons</groupId>
-                       <artifactId>org.apache.commons.collections4</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.xml.security</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.xmlbeans</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.xalan</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.xalan.serializer</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.xml.resolver</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.xerces</artifactId>
-               </dependency>
-
-               <!-- POI (MS office documents) -->
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.poi</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.poi.ooxml</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.poi.ooxml.schemas</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.apache</groupId>
-                       <artifactId>org.apache.poi.scratchpad</artifactId>
-               </dependency>
-
-               <!-- Mail -->
-               <dependency>
-                       <groupId>org.argeo.tp.javax</groupId>
-                       <artifactId>javax.activation</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.javax</groupId>
-                       <artifactId>javax.mail</artifactId>
-               </dependency>
-
-               <!-- Base CMS distribution -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.dep.cms.ui.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <type>pom</type>
-               </dependency>
-
-               <!-- Argeo TP Extras -->
-               <!-- <dependency> -->
-               <!-- <groupId>org.argeo.tp.payment</groupId> -->
-               <!-- <artifactId>com.stripe</artifactId> -->
-               <!-- </dependency> -->
-
-       </dependencies>
-       <profiles>
-               <profile>
-                       <id>rpmbuild</id>
-                       <build>
-                               <plugins>
-                                       <plugin>
-                                               <artifactId>maven-assembly-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>prepare-source</id>
-                                                               <phase>package</phase>
-                                                               <goals>
-                                                                       <goal>single</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <descriptorRefs>
-                                                                               <descriptorRef>a2-source</descriptorRef>
-                                                                       </descriptorRefs>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                                       <plugin>
-                                               <groupId>org.codehaus.mojo</groupId>
-                                               <artifactId>rpm-maven-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>rpm-argeo</id>
-                                                               <phase>package</phase>
-                                                               <goals>
-                                                                       <goal>rpm</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <name>argeo-suite-ui-rap-unstable</name>
-                                                                       <mappings>
-                                                                               <mapping>
-                                                                                       <directory>/usr/share/osgi</directory>
-                                                                                       <username>root</username>
-                                                                                       <groupname>root</groupname>
-                                                                                       <filemode>644</filemode>
-                                                                                       <directoryIncluded>true</directoryIncluded>
-                                                                                       <sources>
-                                                                                               <source>
-                                                                                                       <location>${project.build.directory}/${project.artifactId}-${project.version}-a2-source</location>
-                                                                                                       <includes>
-                                                                                                               <include>**/*.jar</include>
-                                                                                                       </includes>
-                                                                                               </source>
-                                                                                       </sources>
-                                                                               </mapping>
-                                                                       </mappings>
-                                                                       <requires>
-                                                                               <require>argeo-cms-ui-rap</require>
-                                                                               <require>argeo-suite-ui-rap-tp-unstable</require>
-                                                                       </requires>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                               </plugins>
-                       </build>
-               </profile>
-               <profile>
-                       <id>rpmbuild-tp</id>
-                       <build>
-                               <plugins>
-                                       <plugin>
-                                               <artifactId>maven-assembly-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>prepare-source-tp</id>
-                                                               <phase>package</phase>
-                                                               <goals>
-                                                                       <goal>single</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <descriptorRefs>
-                                                                               <descriptorRef>a2-source-tp</descriptorRef>
-                                                                       </descriptorRefs>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                                       <plugin>
-                                               <groupId>org.codehaus.mojo</groupId>
-                                               <artifactId>rpm-maven-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>rpm-tp</id>
-                                                               <phase>package</phase>
-                                                               <goals>
-                                                                       <goal>rpm</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <name>argeo-suite-ui-rap-tp-unstable</name>
-                                                                       <version>${version.argeo-tp}</version>
-                                                                       <release>${maven.build.timestamp}</release>
-                                                                       <mappings>
-                                                                               <mapping>
-                                                                                       <directory>/usr/share/osgi</directory>
-                                                                                       <username>root</username>
-                                                                                       <groupname>root</groupname>
-                                                                                       <filemode>644</filemode>
-                                                                                       <directoryIncluded>true</directoryIncluded>
-                                                                                       <sources>
-                                                                                               <source>
-                                                                                                       <location>${project.build.directory}/${project.artifactId}-${project.version}-a2-source-tp</location>
-                                                                                                       <includes>
-                                                                                                               <include>**/*.jar</include>
-                                                                                                       </includes>
-                                                                                               </source>
-                                                                                       </sources>
-                                                                               </mapping>
-                                                                       </mappings>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                               </plugins>
-                       </build>
-               </profile>
-       </profiles>
-</project>
diff --git a/dep/pom.xml b/dep/pom.xml
deleted file mode 100644 (file)
index 60dc034..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>dep</artifactId>
-       <name>Argeo Suite Dependencies</name>
-       <packaging>pom</packaging>
-       <modules>
-               <module>org.argeo.suite.dep.ui.rap</module>
-               <module>org.argeo.suite.dep.e4.rap</module>
-               <!-- <module>org.argeo.suite.dep.e4.rcp</module> -->
-       </modules>
-       <build>
-               <plugins>
-                       <plugin>
-                               <groupId>org.apache.felix</groupId>
-                               <artifactId>maven-bundle-plugin</artifactId>
-                               <configuration>
-                                       <instructions>
-                                               <SLC-ModularDistribution>default</SLC-ModularDistribution>
-                                       </instructions>
-                               </configuration>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.argeo.maven.plugins</groupId>
-                               <artifactId>argeo-osgi-plugin</artifactId>
-                               <executions>
-                                       <execution>
-                                               <id>generate-descriptors</id>
-                                               <goals>
-                                                       <goal>descriptors</goal>
-                                               </goals>
-                                               <phase>generate-resources</phase>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <artifactId>maven-assembly-plugin</artifactId>
-                               <configuration>
-                                       <attach>false</attach>
-                               </configuration>
-                       </plugin>
-               </plugins>
-       </build>
-       <dependencies>
-               <!-- SDK -->
-               <dependency>
-                       <groupId>org.argeo.tp.equinox</groupId>
-                       <artifactId>org.eclipse.osgi</artifactId>
-                       <scope>test</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.sdk</groupId>
-                       <artifactId>org.junit</artifactId>
-                       <scope>test</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.sdk</groupId>
-                       <artifactId>org.hamcrest</artifactId>
-                       <scope>test</scope>
-               </dependency>
-       </dependencies>
-       <profiles>
-               <profile>
-                       <id>check-osgi</id>
-                       <build>
-                               <plugins>
-                                       <plugin>
-                                               <groupId>org.argeo.maven.plugins</groupId>
-                                               <artifactId>argeo-osgi-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>check-osgi</id>
-                                                               <phase>test</phase>
-                                                               <goals>
-                                                                       <goal>equinox</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <onlyCheck>true</onlyCheck>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                               </plugins>
-                       </build>
-                       <dependencies>
-                               <!-- OSGi test -->
-                               <dependency>
-                                       <groupId>org.argeo.commons</groupId>
-                                       <artifactId>org.argeo.osgi.boot</artifactId>
-                                       <version>${version.argeo-commons}</version>
-                                       <scope>test</scope>
-                               </dependency>
-                       </dependencies>
-               </profile>
-       </profiles>
-</project>
diff --git a/dist/.gitignore b/dist/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/dist/argeo-suite-standard/.gitignore b/dist/argeo-suite-standard/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/dist/argeo-suite-standard/pom.xml b/dist/argeo-suite-standard/pom.xml
deleted file mode 100644 (file)
index a091f2e..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>dist</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>argeo-suite-standard</artifactId>
-       <packaging>pom</packaging>
-       <name>Argeo Suite Standard</name>
-       <profiles>
-               <profile>
-                       <id>rpmbuild</id>
-                       <build>
-                               <plugins>
-                                       <plugin>
-                                               <groupId>org.codehaus.mojo</groupId>
-                                               <artifactId>rpm-maven-plugin</artifactId>
-                                               <executions>
-                                                       <execution>
-                                                               <id>rpm</id>
-                                                               <phase>package</phase>
-                                                               <goals>
-                                                                       <goal>rpm</goal>
-                                                               </goals>
-                                                               <configuration>
-                                                                       <name>argeo-suite-standard-unstable</name>
-                                                                       <mappings>
-                                                                               <mapping>
-                                                                                       <directory>/etc/argeo.d/suite</directory>
-                                                                                       <configuration>noreplace</configuration>
-                                                                                       <directoryIncluded>false</directoryIncluded>
-                                                                                       <sources>
-                                                                                               <source>
-                                                                                                       <location>rpm/etc/argeo.d/suite</location>
-                                                                                               </source>
-                                                                                       </sources>
-                                                                               </mapping>
-                                                                               <mapping>
-                                                                                       <directory>/etc/systemd/system/argeo@suite.service.d</directory>
-                                                                                       <configuration>noreplace</configuration>
-                                                                                       <directoryIncluded>false</directoryIncluded>
-                                                                                       <sources>
-                                                                                               <source>
-                                                                                                       <location>rpm/etc/systemd/system/argeo@suite.service.d</location>
-                                                                                               </source>
-                                                                                       </sources>
-                                                                               </mapping>
-                                                                       </mappings>
-                                                                       <requires>
-                                                                               <require>argeo-suite-ui-rap-unstable</require>
-                                                                       </requires>
-                                                               </configuration>
-                                                       </execution>
-                                               </executions>
-                                       </plugin>
-                               </plugins>
-                       </build>
-               </profile>
-       </profiles>
-</project>
diff --git a/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/config.ini b/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/config.ini
deleted file mode 100644 (file)
index 5596f00..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-org.osgi.service.http.port=8080
-#org.eclipse.equinox.http.jetty.http.host=[IP address to listen to]
-#osgi.console=[IP address to listen to]:2323
-#osgi.console=2323
-osgi.clean=true
-
-argeo.node.useradmin.uris=dc=example,dc=com.ldif
-argeo.node.repo.type=h2
-
-argeo.osgi.start.2.node=\
-org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.metatype,\
-org.eclipse.equinox.cm,\
-org.eclipse.equinox.ds,\
-org.eclipse.rap.rwt.osgi
-
-argeo.osgi.start.2.suite=\
-org.apache.tika.parsers
-
-argeo.osgi.start.3.node=\
-org.argeo.cms
-
-argeo.osgi.start.5.suite=\
-org.argeo.suite.core,\
-org.argeo.suite.ui,\
-org.argeo.suite.theme.default,\
-org.argeo.suite.ui.rap
-
-argeo.osgi.start.6.suite=\
-org.argeo.documents.ui,\
-org.argeo.people.ui,\
-org.argeo.geo.ui
-
-log4j.configuration=file:/etc/argeo.d/suite/log4j.properties
-
-argeo.node.init=/etc/argeo.d/suite/init
diff --git a/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/init/node/dc=example,dc=com.ldif b/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/init/node/dc=example,dc=com.ldif
deleted file mode 100644 (file)
index f5202df..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-dn: dc=example,dc=com
-dc: example
-objectClass: dcObject
-
-dn: ou=People,dc=example,dc=com
-objectClass: top
-objectClass: organizationalUnit
-
-dn: ou=Groups,dc=example,dc=com
-objectClass: top
-objectClass: organizationalUnit
-
-dn: uid=coworker,ou=People,dc=example,dc=com
-objectClass: inetOrgPerson
-objectClass: organizationalPerson
-objectClass: person
-objectClass: top
-givenName: John
-sn: Coworker
-userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
-mail: coworker@localhost
-uid: coworker
-cn: John Coworker
-description: A regular coworker
-
-dn: uid=manager,ou=People,dc=example,dc=com
-objectClass: inetOrgPerson
-objectClass: organizationalPerson
-objectClass: person
-objectClass: top
-givenName: Mary
-sn: Manager
-userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
-mail: manager@localhost
-uid: manager
-cn: Mary Manager
-description: A manager
-
-dn: uid=root,ou=People,dc=example,dc=com
-objectClass: inetOrgPerson
-objectClass: person
-objectClass: organizationalPerson
-objectClass: top
-givenName: Super
-sn: User
-userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
-mail: root@localhost
-uid: root
-cn: Super User
-description: Superuser
-
diff --git a/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/init/node/ou=roles,ou=node.ldif b/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/init/node/ou=roles,ou=node.ldif
deleted file mode 100644 (file)
index d608c2b..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-dn: cn=admin,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: admin
-member: uid=root,ou=People,dc=example,dc=com
-
-dn: cn=org.argeo.activities.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.activities.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.activities.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.activities.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
-dn: cn=org.argeo.connect.resources.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.connect.resources.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.connect.resources.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.connect.resources.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
-dn: cn=org.argeo.office.coworker,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.office.coworker
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-member: uid=coworker,ou=People,dc=example,dc=com
-
-dn: cn=org.argeo.office.manager,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.office.manager
-member: uid=manager,ou=People,dc=example,dc=com
-member: uid=root,ou=People,dc=example,dc=com
-
-dn: cn=org.argeo.people.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.people.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.people.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.people.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
-dn: cn=org.argeo.tracker.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.tracker.editor
-member: cn=org.argeo.office.manager,ou=roles,ou=node
-
-dn: cn=org.argeo.tracker.reader,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.tracker.reader
-member: cn=org.argeo.office.coworker,ou=roles,ou=node
-
-dn: cn=userAdmin,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: userAdmin
-member: cn=admin,ou=roles,ou=node
-
diff --git a/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/jvm.args b/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/jvm.args
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/log4j.properties b/dist/argeo-suite-standard/rpm/etc/argeo.d/suite/log4j.properties
deleted file mode 100644 (file)
index dbc1b6d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-log4j.rootLogger=WARN, console, file
-
-## Levels
-log4j.logger.org.argeo=DEBUG
-log4j.logger.org.djapps.on=DEBUG
-
-## Appenders
-# default appender
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss} %-5p %m [%t] %c%n
-
-## File appender 
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.file=/var/log/argeo.d/suite/node.log
-log4j.appender.file.MaxFileSize=20MB
-log4j.appender.file.MaxBackupIndex=8
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d{ISO8601} %m [%t] %p %n
\ No newline at end of file
diff --git a/dist/argeo-suite-standard/rpm/etc/systemd/system/argeo@suite.service.d/user.conf b/dist/argeo-suite-standard/rpm/etc/systemd/system/argeo@suite.service.d/user.conf
deleted file mode 100644 (file)
index b6619bc..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-[Service]
-User=daemon
-Group=daemon
\ No newline at end of file
diff --git a/dist/pom.xml b/dist/pom.xml
deleted file mode 100644 (file)
index 5674fdc..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>dist</artifactId>
-       <name>Argeo Suite Distributions</name>
-       <packaging>pom</packaging>
-       <modules>
-               <module>argeo-suite-standard</module>
-       </modules>
-</project>
diff --git a/environment/.gitignore b/environment/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/environment/org.argeo.geo.ui/.classpath b/environment/org.argeo.geo.ui/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/environment/org.argeo.geo.ui/.gitignore b/environment/org.argeo.geo.ui/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/environment/org.argeo.geo.ui/.project b/environment/org.argeo.geo.ui/.project
deleted file mode 100644 (file)
index a25e06f..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.geo.ui</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/environment/org.argeo.geo.ui/META-INF/.gitignore b/environment/org.argeo.geo.ui/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/environment/org.argeo.geo.ui/OSGI-INF/l10n/bundle.properties b/environment/org.argeo.geo.ui/OSGI-INF/l10n/bundle.properties
deleted file mode 100644 (file)
index 3ded5eb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-map=map
diff --git a/environment/org.argeo.geo.ui/OSGI-INF/mapLayer.xml b/environment/org.argeo.geo.ui/OSGI-INF/mapLayer.xml
deleted file mode 100644 (file)
index 7cf8487..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
-   <implementation class="org.argeo.suite.ui.DefaultEditionLayer"/>
-   <properties entry="config/mapLayer.properties"/>
-   <service>
-      <provide interface="org.argeo.suite.ui.SuiteLayer"/>
-   </service>
-   <reference bind="setWorkArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.geo.ui.overviewMap)"/>
-</scr:component>
diff --git a/environment/org.argeo.geo.ui/OSGI-INF/overviewMap.xml b/environment/org.argeo.geo.ui/OSGI-INF/overviewMap.xml
deleted file mode 100644 (file)
index c75200a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-   <implementation class="org.argeo.support.openlayers.OverviewMap"/>
-   <properties entry="config/overviewMap.properties"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-</scr:component>
diff --git a/environment/org.argeo.geo.ui/bnd.bnd b/environment/org.argeo.geo.ui/bnd.bnd
deleted file mode 100644 (file)
index a50ed43..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Import-Package:\
-javax.jcr.nodetype,\
-org.osgi.service.event,\
-com.fasterxml.jackson.core,\
-org.argeo.suite.ui,\
-org.argeo.api,\
-org.eclipse.swt,\
-org.eclipse.jface.viewers,\
-org.osgi.framework,\
-*
-
-Service-Component:\
-OSGI-INF/mapLayer.xml,\
-OSGI-INF/overviewMap.xml
diff --git a/environment/org.argeo.geo.ui/build.properties b/environment/org.argeo.geo.ui/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/environment/org.argeo.geo.ui/config/mapLayer.properties b/environment/org.argeo.geo.ui/config/mapLayer.properties
deleted file mode 100644 (file)
index 37bf3c7..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-service.pid=argeo.geo.ui.mapLayer
-
-title=%map
-icon=map
-
-entity.type=entity:geopoint
diff --git a/environment/org.argeo.geo.ui/config/overviewMap.properties b/environment/org.argeo.geo.ui/config/overviewMap.properties
deleted file mode 100644 (file)
index d842c98..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.geo.ui.overviewMap
diff --git a/environment/org.argeo.geo.ui/pom.xml b/environment/org.argeo.geo.ui/pom.xml
deleted file mode 100644 (file)
index a5a4711..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>environment</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.geo.ui</artifactId>
-       <name>Geography UI</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Eclipse E4 -->
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp-rap-e4</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <type>pom</type>
-                       <scope>provided</scope>
-               </dependency>
-               <!-- Specific -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <scope>provided</scope>
-               </dependency>
-
-       </dependencies>
-</project>
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoToSvg.java b/environment/org.argeo.geo.ui/src/org/argeo/geo/GeoToSvg.java
deleted file mode 100644 (file)
index 4d593f2..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.argeo.geo;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/** Converts a geographical feature to an SVG. */
-public class GeoToSvg {
-       public void convertGeoJsonToSvg(Path source, Path target) {
-               ObjectMapper objectMapper = new ObjectMapper();
-               try (InputStream in = Files.newInputStream(source);
-                               Writer out = Files.newBufferedWriter(target, StandardCharsets.UTF_8)) {
-                       JsonNode tree = objectMapper.readTree(in);
-                       JsonNode coord = tree.get("features").get(0).get("geometry").get("coordinates");
-                       double ratio = 100;
-                       double minX = Double.POSITIVE_INFINITY;
-                       double maxX = Double.NEGATIVE_INFINITY;
-                       double minY = Double.POSITIVE_INFINITY;
-                       double maxY = Double.NEGATIVE_INFINITY;
-                       List<String> shapes = new ArrayList<>();
-                       for (JsonNode shape : coord) {
-                               StringBuffer sb = new StringBuffer();
-                               sb.append("<polyline style=\"stroke-width:0.00000003;stroke:#000000;\" points=\"");
-                               for (JsonNode latlng : shape) {
-                                       double lat = latlng.get(0).asDouble();
-                                       double y = lat * ratio;
-                                       if (y < minY)
-                                               minY = y;
-                                       if (y > maxY)
-                                               maxY = y;
-                                       double lng = latlng.get(1).asDouble();
-                                       double x = lng * ratio;
-                                       if (x < minX)
-                                               minX = x;
-                                       if (x > maxX)
-                                               maxX = x;
-                                       sb.append(y + "," + x + " ");
-                               }
-                               sb.append("\">");
-                               sb.append("</polyline>\n");
-                               shapes.add(sb.toString());
-                       }
-
-                       double width = maxX - minX;
-                       double height = maxY - minY;
-                       out.write("<svg xmlns=\"http://www.w3.org/2000/svg\"\n");
-                       out.write(" width=\"" + (int) (width * 1000) + "\"\n");
-                       out.write(" height=\"" + (int) (height * 1000) + "\"\n");
-                       out.write(" viewBox=\"" + minX + "," + minY + "," + width + "," + height + "\"\n");
-                       out.write(">\n");
-                       for (String shape : shapes) {
-                               out.write(shape);
-                               out.write("\n");
-                       }
-                       out.write("</svg>");
-               } catch (IOException e) {
-                       throw new RuntimeException("Cannot convert " + source + " to " + target, e);
-               }
-       }
-
-}
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OpenLayersMap.java
deleted file mode 100644 (file)
index 6fce760..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-package org.argeo.support.openlayers;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.api.NodeConstants;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.entity.EntityNames;
-import org.argeo.entity.EntityType;
-import org.argeo.suite.ui.SuiteEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.BrowserFunction;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/** Display a map. */
-public class OpenLayersMap extends Composite {
-       private static final long serialVersionUID = 1055893020490283622L;
-
-       private final static Log log = LogFactory.getLog(OpenLayersMap.class);
-
-       private Browser browser;
-       private boolean renderCompleted = false;
-
-       private Double centerLng = null, centerLat = null;
-       private Integer zoom = null;
-       private String vectorSource = null;
-       private String gpxSource = null;
-
-       private List<String> geoJsonSources = new ArrayList<>();
-
-       private CmsView cmsView;
-
-       public OpenLayersMap(Composite parent, int style, URL mapHtml) {
-               super(parent, style);
-               cmsView = CmsView.getCmsView(parent);
-               setLayout(new GridLayout());
-
-               browser = new Browser(this, SWT.BORDER);
-               browser.setLayoutData(CmsUiUtils.fillAll());
-               String html;
-               try (InputStream in = mapHtml.openStream()) {
-                       html = IOUtils.toString(in, StandardCharsets.UTF_8);
-               } catch (IOException e) {
-                       throw new RuntimeException(e);
-               }
-               new RenderCompleted(browser, "renderCompleted");
-               new OnFeatureSelect(browser, "onFeatureSelect");
-               new OnFeatureUnselect(browser, "onFeatureUnselect");
-               new OnFeatureClick(browser, "onFeatureClick");
-               browser.setText(html);
-       }
-
-       public void setCenter(Double lng, Double lat) {
-               if (isRenderCompleted())
-                       browser.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng + ", " + lat + "]))");
-               this.centerLat = lat;
-               this.centerLng = lng;
-       }
-
-       public synchronized void setRenderCompleted(boolean renderCompleted) {
-               this.renderCompleted = renderCompleted;
-               notifyAll();
-       }
-
-       public synchronized boolean isRenderCompleted() {
-               return renderCompleted;
-       }
-
-       @Override
-       public synchronized void dispose() {
-               long timeout = 500;
-               long begin = System.currentTimeMillis();
-               while (!isRenderCompleted() && ((System.currentTimeMillis() - begin) < timeout)) {
-                       try {
-                               wait(50);
-                       } catch (InterruptedException e) {
-                               // silent
-                       }
-               }
-               super.dispose();
-       }
-
-       public void setZoom(int zoom) {
-               if (isRenderCompleted())
-                       browser.evaluate("map.getView().setZoom(" + zoom + ")");
-               this.zoom = zoom;
-       }
-
-       public void addPoints(List<Node> geoPoints) throws RepositoryException {
-               boolean first = true;
-               StringBuffer sb = new StringBuffer("new ol.source.Vector({ features: [");
-               for (int i = 0; i < geoPoints.size(); i++) {
-                       Node node = geoPoints.get(i);
-                       if (node.isNodeType(EntityType.geopoint.get())) {
-                               if (first)
-                                       first = false;
-                               else
-                                       sb.append(",");
-                               Double lng = node.getProperty(EntityNames.GEO_LONG).getDouble();
-                               Double lat = node.getProperty(EntityNames.GEO_LAT).getDouble();
-                               sb.append("new ol.Feature({ geometry:");
-                               sb.append("new ol.geom.Point(ol.proj.fromLonLat([");
-                               sb.append(lng).append(',').append(lat);
-                               sb.append("]))");
-                               sb.append(",path:'").append(node.getPath()).append("'");
-                               sb.append("})");
-                       }
-               }
-               sb.append("] })");
-               this.vectorSource = sb.toString();
-               if (log.isTraceEnabled())
-                       log.trace("Vector source: " + vectorSource);
-               renderVectorSource();
-       }
-
-       protected void renderVectorSource() {
-               if (vectorSource == null)
-                       return;
-               if (isRenderCompleted())
-                       browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + vectorSource + "}));");
-       }
-
-       public void addPoint(Double lng, Double lat) {
-               this.vectorSource = "new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
-                               + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] })";
-//             if (renderCompleted) {
-//                     browser.evaluate(
-//                                     "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
-//                                                     + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));");
-//             }
-               renderVectorSource();
-       }
-
-       public void addGpx(String path) {
-               this.gpxSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GPX() })";
-               renderGpxSource();
-       }
-
-       protected void renderGpxSource() {
-               if (gpxSource == null)
-                       return;
-               if (isRenderCompleted())
-                       browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource + "}));");
-       }
-
-       public void addGeoJson(String path) {
-               String geoJsonSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GeoJSON() })";
-               geoJsonSources.add(geoJsonSource);
-               renderGeoJsonSources();
-       }
-
-       protected void renderGeoJsonSources() {
-               if (geoJsonSources.isEmpty())
-                       return;
-               if (isRenderCompleted()) {
-                       for (String geoJson : geoJsonSources) {
-                               browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson + "}));");
-                       }
-               }
-       }
-
-       private class RenderCompleted extends BrowserFunction {
-
-               RenderCompleted(Browser browser, String name) {
-                       super(browser, name);
-               }
-
-               @Override
-               public Object function(Object[] arguments) {
-                       try {
-                               if (!isRenderCompleted()) {
-                                       setRenderCompleted(true);
-                                       if (zoom != null)
-                                               setZoom(zoom);
-                                       if (centerLat != null && centerLng != null) {
-                                               setCenter(centerLng, centerLat);
-                                       }
-                                       if (vectorSource != null)
-                                               renderVectorSource();
-                                       if (gpxSource != null)
-                                               renderGpxSource();
-                                       if (!geoJsonSources.isEmpty())
-                                               renderGeoJsonSources();
-                               }
-                               return null;
-                       } catch (Exception e) {
-                               log.error("Cannot render map", e);
-                               return null;
-                       }
-               }
-       }
-
-       private class OnFeatureSelect extends BrowserFunction {
-
-               OnFeatureSelect(Browser browser, String name) {
-                       super(browser, name);
-               }
-
-               @Override
-               public Object function(Object[] arguments) {
-                       if (arguments.length == 0)
-                               return null;
-                       String path = arguments[0].toString();
-                       Map<String, Object> properties = new HashMap<>();
-                       properties.put(SuiteEvent.NODE_PATH, path);
-                       properties.put(SuiteEvent.WORKSPACE, NodeConstants.SYS_WORKSPACE);
-                       cmsView.sendEvent(SuiteEvent.refreshPart.topic(), properties);
-                       return null;
-               }
-       }
-
-       private class OnFeatureUnselect extends BrowserFunction {
-
-               OnFeatureUnselect(Browser browser, String name) {
-                       super(browser, name);
-               }
-
-               @Override
-               public Object function(Object[] arguments) {
-                       return null;
-               }
-       }
-
-       private class OnFeatureClick extends BrowserFunction {
-
-               OnFeatureClick(Browser browser, String name) {
-                       super(browser, name);
-               }
-
-               @Override
-               public Object function(Object[] arguments) {
-                       return null;
-               }
-       }
-}
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OverviewMap.java b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/OverviewMap.java
deleted file mode 100644 (file)
index 8ecdc1c..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.argeo.support.openlayers;
-
-import java.util.List;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.observation.Event;
-import javax.jcr.observation.EventIterator;
-import javax.jcr.observation.EventListener;
-import javax.jcr.query.Query;
-
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** Displays an overview map. */
-public class OverviewMap implements CmsUiProvider {
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               parent.setLayout(new GridLayout());
-               refreshUi(parent, context);
-
-               try {
-                       String[] nodeTypes = { EntityType.geopoint.get() };
-                       context.getSession().getWorkspace().getObservationManager().addEventListener(new EventListener() {
-
-                               @Override
-                               public void onEvent(EventIterator events) {
-                                       if (!parent.isDisposed())
-                                               parent.getDisplay().asyncExec(() -> {
-                                                       try {
-                                                               refreshUi(parent, context);
-                                                       } catch (RepositoryException e) {
-                                                               throw new JcrException(e);
-                                                       }
-                                               });
-                               }
-                       }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED, "/", true, null,
-                                       nodeTypes, false);
-               } catch (RepositoryException e) {
-                       throw new IllegalStateException("Cannot add JCR observer", e);
-               }
-
-               return parent;
-       }
-
-       protected void refreshUi(Composite parent, Node context) throws RepositoryException {
-               CmsUiUtils.clear(parent);
-               Query query = context.getSession().getWorkspace().getQueryManager()
-                               .createQuery("SELECT * FROM [" + EntityType.geopoint.get() + "]", Query.JCR_SQL2);
-               List<Node> geoPoints = JcrUtils.nodeIteratorToList(query.execute().getNodes());
-               OpenLayersMap apafMap = new OpenLayersMap(parent, SWT.NONE, getClass().getResource("map-osm.html"));
-               apafMap.setLayoutData(CmsUiUtils.fillAll());
-
-               // apafMap.setZoom(7);
-               // apafMap.setCenter(-2.472, 8.010);
-               apafMap.addPoints(geoPoints);
-       }
-}
diff --git a/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/map-osm.html b/environment/org.argeo.geo.ui/src/org/argeo/support/openlayers/map-osm.html
deleted file mode 100644 (file)
index 157d708..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<html lang="en">
-<head>
-<link rel="stylesheet"
-       href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css"
-       type="text/css">
-<style>
-</style>
-<script
-       src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
-</head>
-<body>
-       <div id="map" class="map"></div>
-       <script type="text/javascript">
-       // default OSM
-       var source_OSM = new ol.source.OSM();
-       
-       var map = new ol.Map({
-                       target : 'map',
-                       layers : [ new ol.layer.Tile({
-                               source : source_OSM
-                       }) ],
-                       view : new ol.View({
-                               center : ol.proj.fromLonLat([ 34, 34 ]),
-                               zoom : 4
-                       })
-               });
-               map.on('rendercomplete', e => {
-                       console.log('Render completed.');
-                       renderCompleted();
-               });
-               var select = new ol.interaction.Select();
-               map.addInteraction(select);
-           select.on('select',function (e) {
-               if(e.selected.length>0){
-                               console.log('Feature selected: '+e.selected[0].get('path'));
-                       onFeatureSelect(e.selected[0].get('path'));
-               }
-           });
-       </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/environment/pom.xml b/environment/pom.xml
deleted file mode 100644 (file)
index 7e13702..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>environment</artifactId>
-       <name>Argeo Environment Components</name>
-       <packaging>pom</packaging>
-       <modules>
-               <module>org.argeo.geo.ui</module>
-       </modules>
-</project>
diff --git a/js/.externalToolBuilders/npm run build.launch b/js/.externalToolBuilders/npm run build.launch
new file mode 100644 (file)
index 0000000..c706fc1
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType">
+    <stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${project}"/>
+    <booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="true"/>
+    <stringAttribute key="org.eclipse.ui.externaltools.ATTR_BUILD_SCOPE" value="${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;resources&gt;&#10;&lt;item path=&quot;/argeo-suite-js/package-lock.json&quot; type=&quot;1&quot;/&gt;&#10;&lt;item path=&quot;/argeo-suite-js/package.json&quot; type=&quot;1&quot;/&gt;&#10;&lt;item path=&quot;/argeo-suite-js/src&quot; type=&quot;2&quot;/&gt;&#10;&lt;item path=&quot;/argeo-suite-js/webpack.common.js&quot; type=&quot;1&quot;/&gt;&#10;&lt;item path=&quot;/argeo-suite-js/webpack.dev.js&quot; type=&quot;1&quot;/&gt;&#10;&lt;item path=&quot;/argeo-suite-js/webpack.prod.js&quot; type=&quot;1&quot;/&gt;&#10;&lt;/resources&gt;}"/>
+    <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/npm"/>
+    <stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,"/>
+    <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="run build"/>
+    <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+    <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${project_loc:argeo-suite-js}"/>
+</launchConfiguration>
diff --git a/js/.gitignore b/js/.gitignore
new file mode 100644 (file)
index 0000000..cf1db2e
--- /dev/null
@@ -0,0 +1 @@
+/org/
diff --git a/js/.project b/js/.project
new file mode 100644 (file)
index 0000000..07e0c1b
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>argeo-suite-js</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+                       <triggers>auto,full,incremental,</triggers>
+                       <arguments>
+                               <dictionary>
+                                       <key>LaunchConfigHandle</key>
+                                       <value>&lt;project&gt;/.externalToolBuilders/npm run build.launch</value>
+                               </dictionary>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+</projectDescription>
diff --git a/js/.settings/org.eclipse.core.resources.prefs b/js/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..99f26c0
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/js/.settings/org.eclipse.pde.core.prefs b/js/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..f29e940
--- /dev/null
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/js/Makefile b/js/Makefile
new file mode 100644 (file)
index 0000000..a43be73
--- /dev/null
@@ -0,0 +1,29 @@
+include ../sdk.mk
+
+A2_CATEGORY = org.argeo.suite
+
+BUNDLES = \
+org.argeo.app.js \
+
+all: npm-ci webpack osgi
+
+webpack:
+       npm run build-prod
+
+webpack-dev:
+       npm run build
+
+clean:
+       $(foreach bundle, $(BUNDLES), rm -rf $(bundle)/org) 
+
+npm-ci:
+       npm ci
+       
+npm-install:
+       npm install
+       
+jsdoc:
+       node_modules/.bin/jsdoc -r src \
+               -d $(SDK_BUILD_BASE)/jsdoc/argeo-suite-js
+
+include  $(SDK_SRC_BASE)/sdk/argeo-build/osgi.mk
diff --git a/js/org.argeo.app.js/.gitignore b/js/org.argeo.app.js/.gitignore
new file mode 100644 (file)
index 0000000..cf1db2e
--- /dev/null
@@ -0,0 +1 @@
+/org/
diff --git a/js/org.argeo.app.js/.project b/js/org.argeo.app.js/.project
new file mode 100644 (file)
index 0000000..a2edfff
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.js</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+       </natures>
+</projectDescription>
diff --git a/js/org.argeo.app.js/bnd.bnd b/js/org.argeo.app.js/bnd.bnd
new file mode 100644 (file)
index 0000000..cac0263
--- /dev/null
@@ -0,0 +1,6 @@
+Export-Package: \
+org.argeo.app.js,\
+
+
+Provide-Capability:\
+cms.publish;pkg=org.argeo.app.js;file="*.png,*.js,*.map,*.css,*.html",\
diff --git a/js/org.argeo.app.js/build.properties b/js/org.argeo.app.js/build.properties
new file mode 100644 (file)
index 0000000..9b31242
--- /dev/null
@@ -0,0 +1,2 @@
+bin.includes = META-INF/,\
+               org/
diff --git a/js/package-lock.json b/js/package-lock.json
new file mode 100644 (file)
index 0000000..b886862
--- /dev/null
@@ -0,0 +1,12448 @@
+{
+       "name": "org.argeo.app.js",
+       "version": "2.3.0.next",
+       "lockfileVersion": 2,
+       "requires": true,
+       "packages": {
+               "": {
+                       "name": "org.argeo.app.js",
+                       "version": "2.3.0.next",
+                       "license": "GPL",
+                       "dependencies": {
+                               "@nieuwlandgeo/sldreader": "0.3.x",
+                               "chart.js": "4.x.x",
+                               "chartjs-plugin-annotation": "^3.0.1",
+                               "ol": "8.x.x"
+                       },
+                       "devDependencies": {
+                               "css-loader": "^6.8.1",
+                               "css-minimizer-webpack-plugin": "^5.0.1",
+                               "html-webpack-plugin": "^5.5.3",
+                               "jsdoc": "^4.0.2",
+                               "mini-css-extract-plugin": "^2.7.6",
+                               "npm-check-updates": "^16.13.2",
+                               "style-loader": "^3.3.3",
+                               "webpack": "^5.83.1",
+                               "webpack-cli": "^5.1.1",
+                               "webpack-merge": "^5.9.0"
+                       }
+               },
+               "node_modules/@babel/parser": {
+                       "version": "7.23.6",
+                       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+                       "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+                       "dev": true,
+                       "bin": {
+                               "parser": "bin/babel-parser.js"
+                       },
+                       "engines": {
+                               "node": ">=6.0.0"
+                       }
+               },
+               "node_modules/@colors/colors": {
+                       "version": "1.5.0",
+                       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+                       "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+                       "dev": true,
+                       "optional": true,
+                       "engines": {
+                               "node": ">=0.1.90"
+                       }
+               },
+               "node_modules/@discoveryjs/json-ext": {
+                       "version": "0.5.7",
+                       "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+                       "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10.0.0"
+                       }
+               },
+               "node_modules/@gar/promisify": {
+                       "version": "1.1.3",
+                       "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+                       "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
+                       "dev": true
+               },
+               "node_modules/@isaacs/cliui": {
+                       "version": "8.0.2",
+                       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+                       "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+                       "dev": true,
+                       "dependencies": {
+                               "string-width": "^5.1.2",
+                               "string-width-cjs": "npm:string-width@^4.2.0",
+                               "strip-ansi": "^7.0.1",
+                               "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+                               "wrap-ansi": "^8.1.0",
+                               "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+                       "version": "9.2.2",
+                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                       "dev": true
+               },
+               "node_modules/@isaacs/cliui/node_modules/string-width": {
+                       "version": "5.1.2",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                       "dev": true,
+                       "dependencies": {
+                               "eastasianwidth": "^0.2.0",
+                               "emoji-regex": "^9.2.2",
+                               "strip-ansi": "^7.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/@jest/schemas": {
+                       "version": "29.6.3",
+                       "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+                       "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@sinclair/typebox": "^0.27.8"
+                       },
+                       "engines": {
+                               "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@jest/types": {
+                       "version": "29.6.3",
+                       "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+                       "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jest/schemas": "^29.6.3",
+                               "@types/istanbul-lib-coverage": "^2.0.0",
+                               "@types/istanbul-reports": "^3.0.0",
+                               "@types/node": "*",
+                               "@types/yargs": "^17.0.8",
+                               "chalk": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@jridgewell/gen-mapping": {
+                       "version": "0.3.3",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+                       "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jridgewell/set-array": "^1.0.1",
+                               "@jridgewell/sourcemap-codec": "^1.4.10",
+                               "@jridgewell/trace-mapping": "^0.3.9"
+                       },
+                       "engines": {
+                               "node": ">=6.0.0"
+                       }
+               },
+               "node_modules/@jridgewell/resolve-uri": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+                       "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6.0.0"
+                       }
+               },
+               "node_modules/@jridgewell/set-array": {
+                       "version": "1.1.2",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+                       "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6.0.0"
+                       }
+               },
+               "node_modules/@jridgewell/source-map": {
+                       "version": "0.3.5",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+                       "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jridgewell/gen-mapping": "^0.3.0",
+                               "@jridgewell/trace-mapping": "^0.3.9"
+                       }
+               },
+               "node_modules/@jridgewell/sourcemap-codec": {
+                       "version": "1.4.15",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+                       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+                       "dev": true
+               },
+               "node_modules/@jridgewell/trace-mapping": {
+                       "version": "0.3.20",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+                       "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jridgewell/resolve-uri": "^3.1.0",
+                               "@jridgewell/sourcemap-codec": "^1.4.14"
+                       }
+               },
+               "node_modules/@jsdoc/salty": {
+                       "version": "0.2.7",
+                       "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.7.tgz",
+                       "integrity": "sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==",
+                       "dev": true,
+                       "dependencies": {
+                               "lodash": "^4.17.21"
+                       },
+                       "engines": {
+                               "node": ">=v12.0.0"
+                       }
+               },
+               "node_modules/@kurkle/color": {
+                       "version": "0.3.2",
+                       "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
+                       "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
+               },
+               "node_modules/@nieuwlandgeo/sldreader": {
+                       "version": "0.3.1",
+                       "resolved": "https://registry.npmjs.org/@nieuwlandgeo/sldreader/-/sldreader-0.3.1.tgz",
+                       "integrity": "sha512-gP1dw7ftVT34L6nv8dDtERNIJYENwe2I37Vwdm3NQH+KKHDk7vwrTANxvgKgbNybMXHF29jvI97Z/bkZYBqdxQ==",
+                       "peerDependencies": {
+                               "ol": ">= 5.3.0"
+                       }
+               },
+               "node_modules/@nodelib/fs.scandir": {
+                       "version": "2.1.5",
+                       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+                       "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+                       "dev": true,
+                       "dependencies": {
+                               "@nodelib/fs.stat": "2.0.5",
+                               "run-parallel": "^1.1.9"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/@nodelib/fs.stat": {
+                       "version": "2.0.5",
+                       "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+                       "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/@nodelib/fs.walk": {
+                       "version": "1.2.8",
+                       "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+                       "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@nodelib/fs.scandir": "2.1.5",
+                               "fastq": "^1.6.0"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/@npmcli/fs": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz",
+                       "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==",
+                       "dev": true,
+                       "dependencies": {
+                               "semver": "^7.3.5"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/git": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz",
+                       "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@npmcli/promise-spawn": "^6.0.0",
+                               "lru-cache": "^7.4.4",
+                               "npm-pick-manifest": "^8.0.0",
+                               "proc-log": "^3.0.0",
+                               "promise-inflight": "^1.0.1",
+                               "promise-retry": "^2.0.1",
+                               "semver": "^7.3.5",
+                               "which": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/git/node_modules/which": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+                       "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+                       "dev": true,
+                       "dependencies": {
+                               "isexe": "^2.0.0"
+                       },
+                       "bin": {
+                               "node-which": "bin/which.js"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/installed-package-contents": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz",
+                       "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "npm-bundled": "^3.0.0",
+                               "npm-normalize-package-bin": "^3.0.0"
+                       },
+                       "bin": {
+                               "installed-package-contents": "lib/index.js"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/move-file": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
+                       "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
+                       "deprecated": "This functionality has been moved to @npmcli/fs",
+                       "dev": true,
+                       "dependencies": {
+                               "mkdirp": "^1.0.4",
+                               "rimraf": "^3.0.2"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/@npmcli/move-file/node_modules/brace-expansion": {
+                       "version": "1.1.11",
+                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+                       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+                       "dev": true,
+                       "dependencies": {
+                               "balanced-match": "^1.0.0",
+                               "concat-map": "0.0.1"
+                       }
+               },
+               "node_modules/@npmcli/move-file/node_modules/glob": {
+                       "version": "7.2.3",
+                       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+                       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "fs.realpath": "^1.0.0",
+                               "inflight": "^1.0.4",
+                               "inherits": "2",
+                               "minimatch": "^3.1.1",
+                               "once": "^1.3.0",
+                               "path-is-absolute": "^1.0.0"
+                       },
+                       "engines": {
+                               "node": "*"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/@npmcli/move-file/node_modules/minimatch": {
+                       "version": "3.1.2",
+                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+                       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+                       "dev": true,
+                       "dependencies": {
+                               "brace-expansion": "^1.1.7"
+                       },
+                       "engines": {
+                               "node": "*"
+                       }
+               },
+               "node_modules/@npmcli/move-file/node_modules/rimraf": {
+                       "version": "3.0.2",
+                       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+                       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+                       "dev": true,
+                       "dependencies": {
+                               "glob": "^7.1.3"
+                       },
+                       "bin": {
+                               "rimraf": "bin.js"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/@npmcli/node-gyp": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz",
+                       "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/promise-spawn": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz",
+                       "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==",
+                       "dev": true,
+                       "dependencies": {
+                               "which": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/promise-spawn/node_modules/which": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+                       "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+                       "dev": true,
+                       "dependencies": {
+                               "isexe": "^2.0.0"
+                       },
+                       "bin": {
+                               "node-which": "bin/which.js"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/run-script": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz",
+                       "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@npmcli/node-gyp": "^3.0.0",
+                               "@npmcli/promise-spawn": "^6.0.0",
+                               "node-gyp": "^9.0.0",
+                               "read-package-json-fast": "^3.0.0",
+                               "which": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@npmcli/run-script/node_modules/which": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+                       "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+                       "dev": true,
+                       "dependencies": {
+                               "isexe": "^2.0.0"
+                       },
+                       "bin": {
+                               "node-which": "bin/which.js"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@petamoriken/float16": {
+                       "version": "3.8.4",
+                       "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.4.tgz",
+                       "integrity": "sha512-kB+NJ5Br56ZhElKsf0pM7/PQfrDdDVMRz8f0JM6eVOGE+L89z9hwcst9QvWBBnazzuqGTGtPsJNZoQ1JdNiGSQ=="
+               },
+               "node_modules/@pkgjs/parseargs": {
+                       "version": "0.11.0",
+                       "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+                       "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+                       "dev": true,
+                       "optional": true,
+                       "engines": {
+                               "node": ">=14"
+                       }
+               },
+               "node_modules/@pnpm/config.env-replace": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+                       "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12.22.0"
+                       }
+               },
+               "node_modules/@pnpm/network.ca-file": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+                       "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+                       "dev": true,
+                       "dependencies": {
+                               "graceful-fs": "4.2.10"
+                       },
+                       "engines": {
+                               "node": ">=12.22.0"
+                       }
+               },
+               "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
+                       "version": "4.2.10",
+                       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+                       "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+                       "dev": true
+               },
+               "node_modules/@pnpm/npm-conf": {
+                       "version": "2.2.2",
+                       "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz",
+                       "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@pnpm/config.env-replace": "^1.1.0",
+                               "@pnpm/network.ca-file": "^1.0.1",
+                               "config-chain": "^1.1.11"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/@sigstore/bundle": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz",
+                       "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==",
+                       "dev": true,
+                       "dependencies": {
+                               "@sigstore/protobuf-specs": "^0.2.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@sigstore/protobuf-specs": {
+                       "version": "0.2.1",
+                       "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz",
+                       "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@sigstore/sign": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz",
+                       "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@sigstore/bundle": "^1.1.0",
+                               "@sigstore/protobuf-specs": "^0.2.0",
+                               "make-fetch-happen": "^11.0.1"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@sigstore/tuf": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz",
+                       "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@sigstore/protobuf-specs": "^0.2.0",
+                               "tuf-js": "^1.1.7"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@sinclair/typebox": {
+                       "version": "0.27.8",
+                       "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+                       "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+                       "dev": true
+               },
+               "node_modules/@sindresorhus/is": {
+                       "version": "5.6.0",
+                       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
+                       "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sindresorhus/is?sponsor=1"
+                       }
+               },
+               "node_modules/@szmarczak/http-timer": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+                       "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+                       "dev": true,
+                       "dependencies": {
+                               "defer-to-connect": "^2.0.1"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       }
+               },
+               "node_modules/@tootallnate/once": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+                       "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 10"
+                       }
+               },
+               "node_modules/@trysound/sax": {
+                       "version": "0.2.0",
+                       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+                       "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10.13.0"
+                       }
+               },
+               "node_modules/@tufjs/canonical-json": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz",
+                       "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@tufjs/models": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz",
+                       "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==",
+                       "dev": true,
+                       "dependencies": {
+                               "@tufjs/canonical-json": "1.0.0",
+                               "minimatch": "^9.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/@types/eslint": {
+                       "version": "8.44.9",
+                       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.9.tgz",
+                       "integrity": "sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/estree": "*",
+                               "@types/json-schema": "*"
+                       }
+               },
+               "node_modules/@types/eslint-scope": {
+                       "version": "3.7.7",
+                       "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+                       "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/eslint": "*",
+                               "@types/estree": "*"
+                       }
+               },
+               "node_modules/@types/estree": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+                       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+                       "dev": true
+               },
+               "node_modules/@types/html-minifier-terser": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+                       "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+                       "dev": true
+               },
+               "node_modules/@types/http-cache-semantics": {
+                       "version": "4.0.4",
+                       "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
+                       "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
+                       "dev": true
+               },
+               "node_modules/@types/istanbul-lib-coverage": {
+                       "version": "2.0.6",
+                       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+                       "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+                       "dev": true
+               },
+               "node_modules/@types/istanbul-lib-report": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+                       "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/istanbul-lib-coverage": "*"
+                       }
+               },
+               "node_modules/@types/istanbul-reports": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+                       "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/istanbul-lib-report": "*"
+                       }
+               },
+               "node_modules/@types/json-schema": {
+                       "version": "7.0.15",
+                       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+                       "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+                       "dev": true
+               },
+               "node_modules/@types/linkify-it": {
+                       "version": "3.0.5",
+                       "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz",
+                       "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==",
+                       "dev": true
+               },
+               "node_modules/@types/markdown-it": {
+                       "version": "12.2.3",
+                       "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
+                       "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/linkify-it": "*",
+                               "@types/mdurl": "*"
+                       }
+               },
+               "node_modules/@types/mdurl": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz",
+                       "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==",
+                       "dev": true
+               },
+               "node_modules/@types/node": {
+                       "version": "20.10.4",
+                       "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz",
+                       "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==",
+                       "dev": true,
+                       "dependencies": {
+                               "undici-types": "~5.26.4"
+                       }
+               },
+               "node_modules/@types/yargs": {
+                       "version": "17.0.32",
+                       "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+                       "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/yargs-parser": "*"
+                       }
+               },
+               "node_modules/@types/yargs-parser": {
+                       "version": "21.0.3",
+                       "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+                       "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+                       "dev": true
+               },
+               "node_modules/@webassemblyjs/ast": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+                       "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/helper-numbers": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+                       }
+               },
+               "node_modules/@webassemblyjs/floating-point-hex-parser": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+                       "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+                       "dev": true
+               },
+               "node_modules/@webassemblyjs/helper-api-error": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+                       "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+                       "dev": true
+               },
+               "node_modules/@webassemblyjs/helper-buffer": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+                       "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+                       "dev": true
+               },
+               "node_modules/@webassemblyjs/helper-numbers": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+                       "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+                               "@webassemblyjs/helper-api-error": "1.11.6",
+                               "@xtuc/long": "4.2.2"
+                       }
+               },
+               "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+                       "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+                       "dev": true
+               },
+               "node_modules/@webassemblyjs/helper-wasm-section": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+                       "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-buffer": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/wasm-gen": "1.11.6"
+                       }
+               },
+               "node_modules/@webassemblyjs/ieee754": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+                       "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@xtuc/ieee754": "^1.2.0"
+                       }
+               },
+               "node_modules/@webassemblyjs/leb128": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+                       "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@xtuc/long": "4.2.2"
+                       }
+               },
+               "node_modules/@webassemblyjs/utf8": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+                       "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+                       "dev": true
+               },
+               "node_modules/@webassemblyjs/wasm-edit": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+                       "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-buffer": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/helper-wasm-section": "1.11.6",
+                               "@webassemblyjs/wasm-gen": "1.11.6",
+                               "@webassemblyjs/wasm-opt": "1.11.6",
+                               "@webassemblyjs/wasm-parser": "1.11.6",
+                               "@webassemblyjs/wast-printer": "1.11.6"
+                       }
+               },
+               "node_modules/@webassemblyjs/wasm-gen": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+                       "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/ieee754": "1.11.6",
+                               "@webassemblyjs/leb128": "1.11.6",
+                               "@webassemblyjs/utf8": "1.11.6"
+                       }
+               },
+               "node_modules/@webassemblyjs/wasm-opt": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+                       "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-buffer": "1.11.6",
+                               "@webassemblyjs/wasm-gen": "1.11.6",
+                               "@webassemblyjs/wasm-parser": "1.11.6"
+                       }
+               },
+               "node_modules/@webassemblyjs/wasm-parser": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+                       "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-api-error": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/ieee754": "1.11.6",
+                               "@webassemblyjs/leb128": "1.11.6",
+                               "@webassemblyjs/utf8": "1.11.6"
+                       }
+               },
+               "node_modules/@webassemblyjs/wast-printer": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+                       "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+                       "dev": true,
+                       "dependencies": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@xtuc/long": "4.2.2"
+                       }
+               },
+               "node_modules/@webpack-cli/configtest": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+                       "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.15.0"
+                       },
+                       "peerDependencies": {
+                               "webpack": "5.x.x",
+                               "webpack-cli": "5.x.x"
+                       }
+               },
+               "node_modules/@webpack-cli/info": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+                       "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.15.0"
+                       },
+                       "peerDependencies": {
+                               "webpack": "5.x.x",
+                               "webpack-cli": "5.x.x"
+                       }
+               },
+               "node_modules/@webpack-cli/serve": {
+                       "version": "2.0.5",
+                       "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+                       "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.15.0"
+                       },
+                       "peerDependencies": {
+                               "webpack": "5.x.x",
+                               "webpack-cli": "5.x.x"
+                       },
+                       "peerDependenciesMeta": {
+                               "webpack-dev-server": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/@xtuc/ieee754": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+                       "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+                       "dev": true
+               },
+               "node_modules/@xtuc/long": {
+                       "version": "4.2.2",
+                       "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+                       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+                       "dev": true
+               },
+               "node_modules/abbrev": {
+                       "version": "1.1.1",
+                       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+                       "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+                       "dev": true
+               },
+               "node_modules/acorn": {
+                       "version": "8.11.2",
+                       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
+                       "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+                       "dev": true,
+                       "bin": {
+                               "acorn": "bin/acorn"
+                       },
+                       "engines": {
+                               "node": ">=0.4.0"
+                       }
+               },
+               "node_modules/acorn-import-assertions": {
+                       "version": "1.9.0",
+                       "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+                       "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+                       "dev": true,
+                       "peerDependencies": {
+                               "acorn": "^8"
+                       }
+               },
+               "node_modules/agent-base": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+                       "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "debug": "4"
+                       },
+                       "engines": {
+                               "node": ">= 6.0.0"
+                       }
+               },
+               "node_modules/agentkeepalive": {
+                       "version": "4.5.0",
+                       "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
+                       "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
+                       "dev": true,
+                       "dependencies": {
+                               "humanize-ms": "^1.2.1"
+                       },
+                       "engines": {
+                               "node": ">= 8.0.0"
+                       }
+               },
+               "node_modules/aggregate-error": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+                       "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+                       "dev": true,
+                       "dependencies": {
+                               "clean-stack": "^2.0.0",
+                               "indent-string": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/ajv": {
+                       "version": "8.12.0",
+                       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+                       "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+                       "dev": true,
+                       "dependencies": {
+                               "fast-deep-equal": "^3.1.1",
+                               "json-schema-traverse": "^1.0.0",
+                               "require-from-string": "^2.0.2",
+                               "uri-js": "^4.2.2"
+                       },
+                       "funding": {
+                               "type": "github",
+                               "url": "https://github.com/sponsors/epoberezkin"
+                       }
+               },
+               "node_modules/ajv-formats": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+                       "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+                       "dev": true,
+                       "dependencies": {
+                               "ajv": "^8.0.0"
+                       },
+                       "peerDependencies": {
+                               "ajv": "^8.0.0"
+                       },
+                       "peerDependenciesMeta": {
+                               "ajv": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/ajv-keywords": {
+                       "version": "5.1.0",
+                       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+                       "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+                       "dev": true,
+                       "dependencies": {
+                               "fast-deep-equal": "^3.1.3"
+                       },
+                       "peerDependencies": {
+                               "ajv": "^8.8.2"
+                       }
+               },
+               "node_modules/ansi-align": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+                       "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+                       "dev": true,
+                       "dependencies": {
+                               "string-width": "^4.1.0"
+                       }
+               },
+               "node_modules/ansi-regex": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+                       "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+                       }
+               },
+               "node_modules/ansi-styles": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                       "dev": true,
+                       "dependencies": {
+                               "color-convert": "^2.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+                       }
+               },
+               "node_modules/aproba": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+                       "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+                       "dev": true
+               },
+               "node_modules/are-we-there-yet": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+                       "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+                       "dev": true,
+                       "dependencies": {
+                               "delegates": "^1.0.0",
+                               "readable-stream": "^3.6.0"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/argparse": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+                       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+                       "dev": true
+               },
+               "node_modules/array-union": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+                       "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/balanced-match": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+                       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+                       "dev": true
+               },
+               "node_modules/bluebird": {
+                       "version": "3.7.2",
+                       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+                       "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+                       "dev": true
+               },
+               "node_modules/boolbase": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+                       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+                       "dev": true
+               },
+               "node_modules/boxen": {
+                       "version": "7.1.1",
+                       "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz",
+                       "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-align": "^3.0.1",
+                               "camelcase": "^7.0.1",
+                               "chalk": "^5.2.0",
+                               "cli-boxes": "^3.0.0",
+                               "string-width": "^5.1.2",
+                               "type-fest": "^2.13.0",
+                               "widest-line": "^4.0.1",
+                               "wrap-ansi": "^8.1.0"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/boxen/node_modules/chalk": {
+                       "version": "5.3.0",
+                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+                       "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^12.17.0 || ^14.13 || >=16.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/chalk?sponsor=1"
+                       }
+               },
+               "node_modules/boxen/node_modules/emoji-regex": {
+                       "version": "9.2.2",
+                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                       "dev": true
+               },
+               "node_modules/boxen/node_modules/string-width": {
+                       "version": "5.1.2",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                       "dev": true,
+                       "dependencies": {
+                               "eastasianwidth": "^0.2.0",
+                               "emoji-regex": "^9.2.2",
+                               "strip-ansi": "^7.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/brace-expansion": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+                       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+                       "dev": true,
+                       "dependencies": {
+                               "balanced-match": "^1.0.0"
+                       }
+               },
+               "node_modules/braces": {
+                       "version": "3.0.2",
+                       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+                       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+                       "dev": true,
+                       "dependencies": {
+                               "fill-range": "^7.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/browserslist": {
+                       "version": "4.22.2",
+                       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+                       "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "opencollective",
+                                       "url": "https://opencollective.com/browserslist"
+                               },
+                               {
+                                       "type": "tidelift",
+                                       "url": "https://tidelift.com/funding/github/npm/browserslist"
+                               },
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/ai"
+                               }
+                       ],
+                       "dependencies": {
+                               "caniuse-lite": "^1.0.30001565",
+                               "electron-to-chromium": "^1.4.601",
+                               "node-releases": "^2.0.14",
+                               "update-browserslist-db": "^1.0.13"
+                       },
+                       "bin": {
+                               "browserslist": "cli.js"
+                       },
+                       "engines": {
+                               "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+                       }
+               },
+               "node_modules/buffer-from": {
+                       "version": "1.1.2",
+                       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+                       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+                       "dev": true
+               },
+               "node_modules/builtins": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
+                       "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "semver": "^7.0.0"
+                       }
+               },
+               "node_modules/cacache": {
+                       "version": "17.1.4",
+                       "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz",
+                       "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==",
+                       "dev": true,
+                       "dependencies": {
+                               "@npmcli/fs": "^3.1.0",
+                               "fs-minipass": "^3.0.0",
+                               "glob": "^10.2.2",
+                               "lru-cache": "^7.7.1",
+                               "minipass": "^7.0.3",
+                               "minipass-collect": "^1.0.2",
+                               "minipass-flush": "^1.0.5",
+                               "minipass-pipeline": "^1.2.4",
+                               "p-map": "^4.0.0",
+                               "ssri": "^10.0.0",
+                               "tar": "^6.1.11",
+                               "unique-filename": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/cacache/node_modules/minipass": {
+                       "version": "7.0.4",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=16 || 14 >=14.17"
+                       }
+               },
+               "node_modules/cacheable-lookup": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+                       "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.16"
+                       }
+               },
+               "node_modules/cacheable-request": {
+                       "version": "10.2.14",
+                       "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz",
+                       "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/http-cache-semantics": "^4.0.2",
+                               "get-stream": "^6.0.1",
+                               "http-cache-semantics": "^4.1.1",
+                               "keyv": "^4.5.3",
+                               "mimic-response": "^4.0.0",
+                               "normalize-url": "^8.0.0",
+                               "responselike": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       }
+               },
+               "node_modules/camel-case": {
+                       "version": "4.1.2",
+                       "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+                       "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+                       "dev": true,
+                       "dependencies": {
+                               "pascal-case": "^3.1.2",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "node_modules/camelcase": {
+                       "version": "7.0.1",
+                       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
+                       "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/caniuse-api": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+                       "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.0.0",
+                               "caniuse-lite": "^1.0.0",
+                               "lodash.memoize": "^4.1.2",
+                               "lodash.uniq": "^4.5.0"
+                       }
+               },
+               "node_modules/caniuse-lite": {
+                       "version": "1.0.30001570",
+                       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
+                       "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "opencollective",
+                                       "url": "https://opencollective.com/browserslist"
+                               },
+                               {
+                                       "type": "tidelift",
+                                       "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+                               },
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/ai"
+                               }
+                       ]
+               },
+               "node_modules/catharsis": {
+                       "version": "0.9.0",
+                       "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
+                       "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
+                       "dev": true,
+                       "dependencies": {
+                               "lodash": "^4.17.15"
+                       },
+                       "engines": {
+                               "node": ">= 10"
+                       }
+               },
+               "node_modules/chalk": {
+                       "version": "4.1.2",
+                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+                       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-styles": "^4.1.0",
+                               "supports-color": "^7.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/chalk?sponsor=1"
+                       }
+               },
+               "node_modules/chalk/node_modules/supports-color": {
+                       "version": "7.2.0",
+                       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+                       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+                       "dev": true,
+                       "dependencies": {
+                               "has-flag": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/chart.js": {
+                       "version": "4.4.1",
+                       "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz",
+                       "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==",
+                       "dependencies": {
+                               "@kurkle/color": "^0.3.0"
+                       },
+                       "engines": {
+                               "pnpm": ">=7"
+                       }
+               },
+               "node_modules/chartjs-plugin-annotation": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-3.0.1.tgz",
+                       "integrity": "sha512-hlIrXXKqSDgb+ZjVYHefmlZUXK8KbkCPiynSVrTb/HjTMkT62cOInaT1NTQCKtxKKOm9oHp958DY3RTAFKtkHg==",
+                       "peerDependencies": {
+                               "chart.js": ">=4.0.0"
+                       }
+               },
+               "node_modules/chownr": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+                       "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/chrome-trace-event": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+                       "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6.0"
+                       }
+               },
+               "node_modules/ci-info": {
+                       "version": "3.9.0",
+                       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+                       "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/sibiraj-s"
+                               }
+                       ],
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/clean-css": {
+                       "version": "5.3.3",
+                       "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+                       "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+                       "dev": true,
+                       "dependencies": {
+                               "source-map": "~0.6.0"
+                       },
+                       "engines": {
+                               "node": ">= 10.0"
+                       }
+               },
+               "node_modules/clean-stack": {
+                       "version": "2.2.0",
+                       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+                       "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/cli-boxes": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+                       "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/cli-table3": {
+                       "version": "0.6.3",
+                       "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+                       "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@colors/colors": "1.5.0",
+                               "string-width": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "10.* || >= 12.*"
+                       },
+                       "optionalDependencies": {
+                               "@colors/colors": "1.5.0"
+                       }
+               },
+               "node_modules/clone-deep": {
+                       "version": "4.0.1",
+                       "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+                       "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-plain-object": "^2.0.4",
+                               "kind-of": "^6.0.2",
+                               "shallow-clone": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/color-convert": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "color-name": "~1.1.4"
+                       },
+                       "engines": {
+                               "node": ">=7.0.0"
+                       }
+               },
+               "node_modules/color-name": {
+                       "version": "1.1.4",
+                       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+               },
+               "node_modules/color-parse": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz",
+                       "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==",
+                       "dependencies": {
+                               "color-name": "^1.0.0"
+                       }
+               },
+               "node_modules/color-rgba": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz",
+                       "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==",
+                       "dependencies": {
+                               "color-parse": "^2.0.0",
+                               "color-space": "^2.0.0"
+                       }
+               },
+               "node_modules/color-space": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz",
+                       "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA=="
+               },
+               "node_modules/color-support": {
+                       "version": "1.1.3",
+                       "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+                       "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+                       "dev": true,
+                       "bin": {
+                               "color-support": "bin.js"
+                       }
+               },
+               "node_modules/colord": {
+                       "version": "2.9.3",
+                       "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+                       "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+                       "dev": true
+               },
+               "node_modules/colorette": {
+                       "version": "2.0.20",
+                       "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+                       "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+                       "dev": true
+               },
+               "node_modules/commander": {
+                       "version": "8.3.0",
+                       "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+                       "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 12"
+                       }
+               },
+               "node_modules/concat-map": {
+                       "version": "0.0.1",
+                       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+                       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+                       "dev": true
+               },
+               "node_modules/config-chain": {
+                       "version": "1.1.13",
+                       "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+                       "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ini": "^1.3.4",
+                               "proto-list": "~1.2.1"
+                       }
+               },
+               "node_modules/config-chain/node_modules/ini": {
+                       "version": "1.3.8",
+                       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+                       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+                       "dev": true
+               },
+               "node_modules/configstore": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
+                       "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
+                       "dev": true,
+                       "dependencies": {
+                               "dot-prop": "^6.0.1",
+                               "graceful-fs": "^4.2.6",
+                               "unique-string": "^3.0.0",
+                               "write-file-atomic": "^3.0.3",
+                               "xdg-basedir": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/yeoman/configstore?sponsor=1"
+                       }
+               },
+               "node_modules/console-control-strings": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+                       "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+                       "dev": true
+               },
+               "node_modules/cross-spawn": {
+                       "version": "7.0.3",
+                       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+                       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+                       "dev": true,
+                       "dependencies": {
+                               "path-key": "^3.1.0",
+                               "shebang-command": "^2.0.0",
+                               "which": "^2.0.1"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/crypto-random-string": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
+                       "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
+                       "dev": true,
+                       "dependencies": {
+                               "type-fest": "^1.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/crypto-random-string/node_modules/type-fest": {
+                       "version": "1.4.0",
+                       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+                       "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/css-declaration-sorter": {
+                       "version": "6.4.1",
+                       "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
+                       "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^10 || ^12 || >=14"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.0.9"
+                       }
+               },
+               "node_modules/css-loader": {
+                       "version": "6.8.1",
+                       "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz",
+                       "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==",
+                       "dev": true,
+                       "dependencies": {
+                               "icss-utils": "^5.1.0",
+                               "postcss": "^8.4.21",
+                               "postcss-modules-extract-imports": "^3.0.0",
+                               "postcss-modules-local-by-default": "^4.0.3",
+                               "postcss-modules-scope": "^3.0.0",
+                               "postcss-modules-values": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0",
+                               "semver": "^7.3.8"
+                       },
+                       "engines": {
+                               "node": ">= 12.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       },
+                       "peerDependencies": {
+                               "webpack": "^5.0.0"
+                       }
+               },
+               "node_modules/css-minimizer-webpack-plugin": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz",
+                       "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jridgewell/trace-mapping": "^0.3.18",
+                               "cssnano": "^6.0.1",
+                               "jest-worker": "^29.4.3",
+                               "postcss": "^8.4.24",
+                               "schema-utils": "^4.0.1",
+                               "serialize-javascript": "^6.0.1"
+                       },
+                       "engines": {
+                               "node": ">= 14.15.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       },
+                       "peerDependencies": {
+                               "webpack": "^5.0.0"
+                       },
+                       "peerDependenciesMeta": {
+                               "@parcel/css": {
+                                       "optional": true
+                               },
+                               "@swc/css": {
+                                       "optional": true
+                               },
+                               "clean-css": {
+                                       "optional": true
+                               },
+                               "csso": {
+                                       "optional": true
+                               },
+                               "esbuild": {
+                                       "optional": true
+                               },
+                               "lightningcss": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/css-select": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+                       "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "boolbase": "^1.0.0",
+                               "css-what": "^6.0.1",
+                               "domhandler": "^4.3.1",
+                               "domutils": "^2.8.0",
+                               "nth-check": "^2.0.1"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/fb55"
+                       }
+               },
+               "node_modules/css-tree": {
+                       "version": "2.3.1",
+                       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+                       "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+                       "dev": true,
+                       "dependencies": {
+                               "mdn-data": "2.0.30",
+                               "source-map-js": "^1.0.1"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+                       }
+               },
+               "node_modules/css-what": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+                       "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 6"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/fb55"
+                       }
+               },
+               "node_modules/cssesc": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+                       "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+                       "dev": true,
+                       "bin": {
+                               "cssesc": "bin/cssesc"
+                       },
+                       "engines": {
+                               "node": ">=4"
+                       }
+               },
+               "node_modules/cssnano": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz",
+                       "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==",
+                       "dev": true,
+                       "dependencies": {
+                               "cssnano-preset-default": "^6.0.1",
+                               "lilconfig": "^2.1.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/cssnano"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/cssnano-preset-default": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz",
+                       "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "css-declaration-sorter": "^6.3.1",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-calc": "^9.0.0",
+                               "postcss-colormin": "^6.0.0",
+                               "postcss-convert-values": "^6.0.0",
+                               "postcss-discard-comments": "^6.0.0",
+                               "postcss-discard-duplicates": "^6.0.0",
+                               "postcss-discard-empty": "^6.0.0",
+                               "postcss-discard-overridden": "^6.0.0",
+                               "postcss-merge-longhand": "^6.0.0",
+                               "postcss-merge-rules": "^6.0.1",
+                               "postcss-minify-font-values": "^6.0.0",
+                               "postcss-minify-gradients": "^6.0.0",
+                               "postcss-minify-params": "^6.0.0",
+                               "postcss-minify-selectors": "^6.0.0",
+                               "postcss-normalize-charset": "^6.0.0",
+                               "postcss-normalize-display-values": "^6.0.0",
+                               "postcss-normalize-positions": "^6.0.0",
+                               "postcss-normalize-repeat-style": "^6.0.0",
+                               "postcss-normalize-string": "^6.0.0",
+                               "postcss-normalize-timing-functions": "^6.0.0",
+                               "postcss-normalize-unicode": "^6.0.0",
+                               "postcss-normalize-url": "^6.0.0",
+                               "postcss-normalize-whitespace": "^6.0.0",
+                               "postcss-ordered-values": "^6.0.0",
+                               "postcss-reduce-initial": "^6.0.0",
+                               "postcss-reduce-transforms": "^6.0.0",
+                               "postcss-svgo": "^6.0.0",
+                               "postcss-unique-selectors": "^6.0.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/cssnano-utils": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz",
+                       "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/csso": {
+                       "version": "5.0.5",
+                       "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+                       "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "css-tree": "~2.2.0"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+                               "npm": ">=7.0.0"
+                       }
+               },
+               "node_modules/csso/node_modules/css-tree": {
+                       "version": "2.2.1",
+                       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+                       "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+                       "dev": true,
+                       "dependencies": {
+                               "mdn-data": "2.0.28",
+                               "source-map-js": "^1.0.1"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+                               "npm": ">=7.0.0"
+                       }
+               },
+               "node_modules/csso/node_modules/mdn-data": {
+                       "version": "2.0.28",
+                       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+                       "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+                       "dev": true
+               },
+               "node_modules/debug": {
+                       "version": "4.3.4",
+                       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+                       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ms": "2.1.2"
+                       },
+                       "engines": {
+                               "node": ">=6.0"
+                       },
+                       "peerDependenciesMeta": {
+                               "supports-color": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/decompress-response": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+                       "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "mimic-response": "^3.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/decompress-response/node_modules/mimic-response": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+                       "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/deep-extend": {
+                       "version": "0.6.0",
+                       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+                       "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=4.0.0"
+                       }
+               },
+               "node_modules/defer-to-connect": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+                       "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/delegates": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+                       "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+                       "dev": true
+               },
+               "node_modules/dir-glob": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+                       "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+                       "dev": true,
+                       "dependencies": {
+                               "path-type": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/dom-converter": {
+                       "version": "0.2.0",
+                       "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+                       "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+                       "dev": true,
+                       "dependencies": {
+                               "utila": "~0.4"
+                       }
+               },
+               "node_modules/dom-serializer": {
+                       "version": "1.4.1",
+                       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+                       "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+                       "dev": true,
+                       "dependencies": {
+                               "domelementtype": "^2.0.1",
+                               "domhandler": "^4.2.0",
+                               "entities": "^2.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+                       }
+               },
+               "node_modules/domelementtype": {
+                       "version": "2.3.0",
+                       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+                       "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/fb55"
+                               }
+                       ]
+               },
+               "node_modules/domhandler": {
+                       "version": "4.3.1",
+                       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+                       "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "domelementtype": "^2.2.0"
+                       },
+                       "engines": {
+                               "node": ">= 4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/fb55/domhandler?sponsor=1"
+                       }
+               },
+               "node_modules/domutils": {
+                       "version": "2.8.0",
+                       "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+                       "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+                       "dev": true,
+                       "dependencies": {
+                               "dom-serializer": "^1.0.1",
+                               "domelementtype": "^2.2.0",
+                               "domhandler": "^4.2.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/fb55/domutils?sponsor=1"
+                       }
+               },
+               "node_modules/dot-case": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+                       "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+                       "dev": true,
+                       "dependencies": {
+                               "no-case": "^3.0.4",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "node_modules/dot-prop": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
+                       "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-obj": "^2.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/earcut": {
+                       "version": "2.2.4",
+                       "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+                       "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+               },
+               "node_modules/eastasianwidth": {
+                       "version": "0.2.0",
+                       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+                       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+                       "dev": true
+               },
+               "node_modules/electron-to-chromium": {
+                       "version": "1.4.612",
+                       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.612.tgz",
+                       "integrity": "sha512-dM8BMtXtlH237ecSMnYdYuCkib2QHq0kpWfUnavjdYsyr/6OsAwg5ZGUfnQ9KD1Ga4QgB2sqXlB2NT8zy2GnVg==",
+                       "dev": true
+               },
+               "node_modules/emoji-regex": {
+                       "version": "8.0.0",
+                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+                       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+                       "dev": true
+               },
+               "node_modules/encoding": {
+                       "version": "0.1.13",
+                       "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+                       "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+                       "dev": true,
+                       "optional": true,
+                       "dependencies": {
+                               "iconv-lite": "^0.6.2"
+                       }
+               },
+               "node_modules/enhanced-resolve": {
+                       "version": "5.15.0",
+                       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+                       "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+                       "dev": true,
+                       "dependencies": {
+                               "graceful-fs": "^4.2.4",
+                               "tapable": "^2.2.0"
+                       },
+                       "engines": {
+                               "node": ">=10.13.0"
+                       }
+               },
+               "node_modules/entities": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+                       "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+                       "dev": true,
+                       "funding": {
+                               "url": "https://github.com/fb55/entities?sponsor=1"
+                       }
+               },
+               "node_modules/env-paths": {
+                       "version": "2.2.1",
+                       "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+                       "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/envinfo": {
+                       "version": "7.11.0",
+                       "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
+                       "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
+                       "dev": true,
+                       "bin": {
+                               "envinfo": "dist/cli.js"
+                       },
+                       "engines": {
+                               "node": ">=4"
+                       }
+               },
+               "node_modules/err-code": {
+                       "version": "2.0.3",
+                       "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+                       "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+                       "dev": true
+               },
+               "node_modules/es-module-lexer": {
+                       "version": "1.4.1",
+                       "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+                       "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
+                       "dev": true
+               },
+               "node_modules/escalade": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+                       "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/escape-goat": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz",
+                       "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/escape-string-regexp": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+                       "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/eslint-scope": {
+                       "version": "5.1.1",
+                       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+                       "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+                       "dev": true,
+                       "dependencies": {
+                               "esrecurse": "^4.3.0",
+                               "estraverse": "^4.1.1"
+                       },
+                       "engines": {
+                               "node": ">=8.0.0"
+                       }
+               },
+               "node_modules/esrecurse": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+                       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+                       "dev": true,
+                       "dependencies": {
+                               "estraverse": "^5.2.0"
+                       },
+                       "engines": {
+                               "node": ">=4.0"
+                       }
+               },
+               "node_modules/esrecurse/node_modules/estraverse": {
+                       "version": "5.3.0",
+                       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+                       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=4.0"
+                       }
+               },
+               "node_modules/estraverse": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+                       "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=4.0"
+                       }
+               },
+               "node_modules/events": {
+                       "version": "3.3.0",
+                       "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+                       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.8.x"
+                       }
+               },
+               "node_modules/exponential-backoff": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
+                       "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==",
+                       "dev": true
+               },
+               "node_modules/fast-deep-equal": {
+                       "version": "3.1.3",
+                       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+                       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+                       "dev": true
+               },
+               "node_modules/fast-glob": {
+                       "version": "3.3.2",
+                       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+                       "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+                       "dev": true,
+                       "dependencies": {
+                               "@nodelib/fs.stat": "^2.0.2",
+                               "@nodelib/fs.walk": "^1.2.3",
+                               "glob-parent": "^5.1.2",
+                               "merge2": "^1.3.0",
+                               "micromatch": "^4.0.4"
+                       },
+                       "engines": {
+                               "node": ">=8.6.0"
+                       }
+               },
+               "node_modules/fast-json-stable-stringify": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+                       "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+                       "dev": true
+               },
+               "node_modules/fast-memoize": {
+                       "version": "2.5.2",
+                       "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz",
+                       "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==",
+                       "dev": true
+               },
+               "node_modules/fastest-levenshtein": {
+                       "version": "1.0.16",
+                       "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+                       "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 4.9.1"
+                       }
+               },
+               "node_modules/fastq": {
+                       "version": "1.15.0",
+                       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+                       "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+                       "dev": true,
+                       "dependencies": {
+                               "reusify": "^1.0.4"
+                       }
+               },
+               "node_modules/fill-range": {
+                       "version": "7.0.1",
+                       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+                       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "to-regex-range": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/find-up": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+                       "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+                       "dev": true,
+                       "dependencies": {
+                               "locate-path": "^6.0.0",
+                               "path-exists": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/flat": {
+                       "version": "5.0.2",
+                       "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+                       "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+                       "dev": true,
+                       "bin": {
+                               "flat": "cli.js"
+                       }
+               },
+               "node_modules/foreground-child": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+                       "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+                       "dev": true,
+                       "dependencies": {
+                               "cross-spawn": "^7.0.0",
+                               "signal-exit": "^4.0.1"
+                       },
+                       "engines": {
+                               "node": ">=14"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/form-data-encoder": {
+                       "version": "2.1.4",
+                       "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+                       "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 14.17"
+                       }
+               },
+               "node_modules/fp-and-or": {
+                       "version": "0.1.4",
+                       "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz",
+                       "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/fs-minipass": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+                       "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^7.0.3"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/fs-minipass/node_modules/minipass": {
+                       "version": "7.0.4",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=16 || 14 >=14.17"
+                       }
+               },
+               "node_modules/fs.realpath": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+                       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+                       "dev": true
+               },
+               "node_modules/function-bind": {
+                       "version": "1.1.2",
+                       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+                       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+                       "dev": true,
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/gauge": {
+                       "version": "4.0.4",
+                       "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+                       "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+                       "dev": true,
+                       "dependencies": {
+                               "aproba": "^1.0.3 || ^2.0.0",
+                               "color-support": "^1.1.3",
+                               "console-control-strings": "^1.1.0",
+                               "has-unicode": "^2.0.1",
+                               "signal-exit": "^3.0.7",
+                               "string-width": "^4.2.3",
+                               "strip-ansi": "^6.0.1",
+                               "wide-align": "^1.1.5"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/gauge/node_modules/ansi-regex": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/gauge/node_modules/signal-exit": {
+                       "version": "3.0.7",
+                       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+                       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+                       "dev": true
+               },
+               "node_modules/gauge/node_modules/strip-ansi": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/geotiff": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.0.tgz",
+                       "integrity": "sha512-B/iFJuFfRpmPHXf8aIRPRgUWwfaNb6dlsynkM8SWeHAPu7CpyvfqEa43KlBt7xxq5OTVysQacFHxhCn3SZhRKQ==",
+                       "dependencies": {
+                               "@petamoriken/float16": "^3.4.7",
+                               "lerc": "^3.0.0",
+                               "pako": "^2.0.4",
+                               "parse-headers": "^2.0.2",
+                               "quick-lru": "^6.1.1",
+                               "web-worker": "^1.2.0",
+                               "xml-utils": "^1.0.2",
+                               "zstddec": "^0.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10.19"
+                       }
+               },
+               "node_modules/get-stdin": {
+                       "version": "8.0.0",
+                       "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+                       "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/get-stream": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+                       "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/glob": {
+                       "version": "10.3.10",
+                       "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+                       "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+                       "dev": true,
+                       "dependencies": {
+                               "foreground-child": "^3.1.0",
+                               "jackspeak": "^2.3.5",
+                               "minimatch": "^9.0.1",
+                               "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+                               "path-scurry": "^1.10.1"
+                       },
+                       "bin": {
+                               "glob": "dist/esm/bin.mjs"
+                       },
+                       "engines": {
+                               "node": ">=16 || 14 >=14.17"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/glob-parent": {
+                       "version": "5.1.2",
+                       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+                       "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-glob": "^4.0.1"
+                       },
+                       "engines": {
+                               "node": ">= 6"
+                       }
+               },
+               "node_modules/glob-to-regexp": {
+                       "version": "0.4.1",
+                       "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+                       "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+                       "dev": true
+               },
+               "node_modules/global-dirs": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+                       "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+                       "dev": true,
+                       "dependencies": {
+                               "ini": "2.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/global-dirs/node_modules/ini": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+                       "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/globby": {
+                       "version": "11.1.0",
+                       "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+                       "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+                       "dev": true,
+                       "dependencies": {
+                               "array-union": "^2.1.0",
+                               "dir-glob": "^3.0.1",
+                               "fast-glob": "^3.2.9",
+                               "ignore": "^5.2.0",
+                               "merge2": "^1.4.1",
+                               "slash": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/got": {
+                       "version": "12.6.1",
+                       "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
+                       "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@sindresorhus/is": "^5.2.0",
+                               "@szmarczak/http-timer": "^5.0.1",
+                               "cacheable-lookup": "^7.0.0",
+                               "cacheable-request": "^10.2.8",
+                               "decompress-response": "^6.0.0",
+                               "form-data-encoder": "^2.1.2",
+                               "get-stream": "^6.0.1",
+                               "http2-wrapper": "^2.1.10",
+                               "lowercase-keys": "^3.0.0",
+                               "p-cancelable": "^3.0.0",
+                               "responselike": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sindresorhus/got?sponsor=1"
+                       }
+               },
+               "node_modules/graceful-fs": {
+                       "version": "4.2.11",
+                       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+                       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+                       "dev": true
+               },
+               "node_modules/has-flag": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+                       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/has-unicode": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+                       "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+                       "dev": true
+               },
+               "node_modules/has-yarn": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz",
+                       "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/hasown": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+                       "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+                       "dev": true,
+                       "dependencies": {
+                               "function-bind": "^1.1.2"
+                       },
+                       "engines": {
+                               "node": ">= 0.4"
+                       }
+               },
+               "node_modules/he": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+                       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+                       "dev": true,
+                       "bin": {
+                               "he": "bin/he"
+                       }
+               },
+               "node_modules/hosted-git-info": {
+                       "version": "5.2.1",
+                       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz",
+                       "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==",
+                       "dev": true,
+                       "dependencies": {
+                               "lru-cache": "^7.5.1"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/html-minifier-terser": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+                       "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+                       "dev": true,
+                       "dependencies": {
+                               "camel-case": "^4.1.2",
+                               "clean-css": "^5.2.2",
+                               "commander": "^8.3.0",
+                               "he": "^1.2.0",
+                               "param-case": "^3.0.4",
+                               "relateurl": "^0.2.7",
+                               "terser": "^5.10.0"
+                       },
+                       "bin": {
+                               "html-minifier-terser": "cli.js"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/html-webpack-plugin": {
+                       "version": "5.5.4",
+                       "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.4.tgz",
+                       "integrity": "sha512-3wNSaVVxdxcu0jd4FpQFoICdqgxs4zIQQvj+2yQKFfBOnLETQ6X5CDWdeasuGlSsooFlMkEioWDTqBv1wvw5Iw==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/html-minifier-terser": "^6.0.0",
+                               "html-minifier-terser": "^6.0.2",
+                               "lodash": "^4.17.21",
+                               "pretty-error": "^4.0.0",
+                               "tapable": "^2.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/html-webpack-plugin"
+                       },
+                       "peerDependencies": {
+                               "webpack": "^5.20.0"
+                       }
+               },
+               "node_modules/htmlparser2": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+                       "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+                       "dev": true,
+                       "funding": [
+                               "https://github.com/fb55/htmlparser2?sponsor=1",
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/fb55"
+                               }
+                       ],
+                       "dependencies": {
+                               "domelementtype": "^2.0.1",
+                               "domhandler": "^4.0.0",
+                               "domutils": "^2.5.2",
+                               "entities": "^2.0.0"
+                       }
+               },
+               "node_modules/http-cache-semantics": {
+                       "version": "4.1.1",
+                       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+                       "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+                       "dev": true
+               },
+               "node_modules/http-proxy-agent": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+                       "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+                       "dev": true,
+                       "dependencies": {
+                               "@tootallnate/once": "2",
+                               "agent-base": "6",
+                               "debug": "4"
+                       },
+                       "engines": {
+                               "node": ">= 6"
+                       }
+               },
+               "node_modules/http2-wrapper": {
+                       "version": "2.2.1",
+                       "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
+                       "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "quick-lru": "^5.1.1",
+                               "resolve-alpn": "^1.2.0"
+                       },
+                       "engines": {
+                               "node": ">=10.19.0"
+                       }
+               },
+               "node_modules/http2-wrapper/node_modules/quick-lru": {
+                       "version": "5.1.1",
+                       "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+                       "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/https-proxy-agent": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+                       "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+                       "dev": true,
+                       "dependencies": {
+                               "agent-base": "6",
+                               "debug": "4"
+                       },
+                       "engines": {
+                               "node": ">= 6"
+                       }
+               },
+               "node_modules/humanize-ms": {
+                       "version": "1.2.1",
+                       "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+                       "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ms": "^2.0.0"
+                       }
+               },
+               "node_modules/iconv-lite": {
+                       "version": "0.6.3",
+                       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+                       "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+                       "dev": true,
+                       "optional": true,
+                       "dependencies": {
+                               "safer-buffer": ">= 2.1.2 < 3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/icss-utils": {
+                       "version": "5.1.0",
+                       "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+                       "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^10 || ^12 || >= 14"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.1.0"
+                       }
+               },
+               "node_modules/ieee754": {
+                       "version": "1.2.1",
+                       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+                       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+                       "funding": [
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/feross"
+                               },
+                               {
+                                       "type": "patreon",
+                                       "url": "https://www.patreon.com/feross"
+                               },
+                               {
+                                       "type": "consulting",
+                                       "url": "https://feross.org/support"
+                               }
+                       ]
+               },
+               "node_modules/ignore": {
+                       "version": "5.3.0",
+                       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+                       "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 4"
+                       }
+               },
+               "node_modules/ignore-walk": {
+                       "version": "6.0.4",
+                       "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz",
+                       "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==",
+                       "dev": true,
+                       "dependencies": {
+                               "minimatch": "^9.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/import-lazy": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+                       "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/import-local": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+                       "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+                       "dev": true,
+                       "dependencies": {
+                               "pkg-dir": "^4.2.0",
+                               "resolve-cwd": "^3.0.0"
+                       },
+                       "bin": {
+                               "import-local-fixture": "fixtures/cli.js"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/imurmurhash": {
+                       "version": "0.1.4",
+                       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+                       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.8.19"
+                       }
+               },
+               "node_modules/indent-string": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+                       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/infer-owner": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+                       "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+                       "dev": true
+               },
+               "node_modules/inflight": {
+                       "version": "1.0.6",
+                       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+                       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+                       "dev": true,
+                       "dependencies": {
+                               "once": "^1.3.0",
+                               "wrappy": "1"
+                       }
+               },
+               "node_modules/inherits": {
+                       "version": "2.0.4",
+                       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+                       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+                       "dev": true
+               },
+               "node_modules/ini": {
+                       "version": "4.1.1",
+                       "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+                       "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/interpret": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
+                       "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10.13.0"
+                       }
+               },
+               "node_modules/ip": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+                       "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+                       "dev": true
+               },
+               "node_modules/is-ci": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+                       "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ci-info": "^3.2.0"
+                       },
+                       "bin": {
+                               "is-ci": "bin.js"
+                       }
+               },
+               "node_modules/is-core-module": {
+                       "version": "2.13.1",
+                       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+                       "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+                       "dev": true,
+                       "dependencies": {
+                               "hasown": "^2.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/is-extglob": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+                       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/is-fullwidth-code-point": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+                       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/is-glob": {
+                       "version": "4.0.3",
+                       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+                       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-extglob": "^2.1.1"
+                       },
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/is-installed-globally": {
+                       "version": "0.4.0",
+                       "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+                       "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "global-dirs": "^3.0.0",
+                               "is-path-inside": "^3.0.2"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/is-lambda": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+                       "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+                       "dev": true
+               },
+               "node_modules/is-npm": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz",
+                       "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/is-number": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+                       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.12.0"
+                       }
+               },
+               "node_modules/is-obj": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+                       "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/is-path-inside": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+                       "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/is-plain-object": {
+                       "version": "2.0.4",
+                       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+                       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+                       "dev": true,
+                       "dependencies": {
+                               "isobject": "^3.0.1"
+                       },
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/is-typedarray": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+                       "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+                       "dev": true
+               },
+               "node_modules/is-yarn-global": {
+                       "version": "0.4.1",
+                       "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz",
+                       "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/isexe": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+                       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+                       "dev": true
+               },
+               "node_modules/isobject": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+                       "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/jackspeak": {
+                       "version": "2.3.6",
+                       "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+                       "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@isaacs/cliui": "^8.0.2",
+                               "@pkgjs/parseargs": "^0.11.0"
+                       },
+                       "engines": {
+                               "node": ">=14"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       },
+                       "optionalDependencies": {
+                               "@pkgjs/parseargs": "^0.11.0"
+                       }
+               },
+               "node_modules/jest-util": {
+                       "version": "29.7.0",
+                       "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+                       "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jest/types": "^29.6.3",
+                               "@types/node": "*",
+                               "chalk": "^4.0.0",
+                               "ci-info": "^3.2.0",
+                               "graceful-fs": "^4.2.9",
+                               "picomatch": "^2.2.3"
+                       },
+                       "engines": {
+                               "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/jest-worker": {
+                       "version": "29.7.0",
+                       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+                       "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/node": "*",
+                               "jest-util": "^29.7.0",
+                               "merge-stream": "^2.0.0",
+                               "supports-color": "^8.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/jju": {
+                       "version": "1.4.0",
+                       "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
+                       "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
+                       "dev": true
+               },
+               "node_modules/js-yaml": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+                       "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+                       "dev": true,
+                       "dependencies": {
+                               "argparse": "^2.0.1"
+                       },
+                       "bin": {
+                               "js-yaml": "bin/js-yaml.js"
+                       }
+               },
+               "node_modules/js2xmlparser": {
+                       "version": "4.0.2",
+                       "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
+                       "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
+                       "dev": true,
+                       "dependencies": {
+                               "xmlcreate": "^2.0.4"
+                       }
+               },
+               "node_modules/jsdoc": {
+                       "version": "4.0.2",
+                       "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
+                       "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@babel/parser": "^7.20.15",
+                               "@jsdoc/salty": "^0.2.1",
+                               "@types/markdown-it": "^12.2.3",
+                               "bluebird": "^3.7.2",
+                               "catharsis": "^0.9.0",
+                               "escape-string-regexp": "^2.0.0",
+                               "js2xmlparser": "^4.0.2",
+                               "klaw": "^3.0.0",
+                               "markdown-it": "^12.3.2",
+                               "markdown-it-anchor": "^8.4.1",
+                               "marked": "^4.0.10",
+                               "mkdirp": "^1.0.4",
+                               "requizzle": "^0.2.3",
+                               "strip-json-comments": "^3.1.0",
+                               "underscore": "~1.13.2"
+                       },
+                       "bin": {
+                               "jsdoc": "jsdoc.js"
+                       },
+                       "engines": {
+                               "node": ">=12.0.0"
+                       }
+               },
+               "node_modules/json-buffer": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+                       "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+                       "dev": true
+               },
+               "node_modules/json-parse-even-better-errors": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz",
+                       "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/json-parse-helpfulerror": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz",
+                       "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==",
+                       "dev": true,
+                       "dependencies": {
+                               "jju": "^1.1.0"
+                       }
+               },
+               "node_modules/json-schema-traverse": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+                       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+                       "dev": true
+               },
+               "node_modules/json5": {
+                       "version": "2.2.3",
+                       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+                       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+                       "dev": true,
+                       "bin": {
+                               "json5": "lib/cli.js"
+                       },
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/jsonlines": {
+                       "version": "0.1.1",
+                       "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz",
+                       "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==",
+                       "dev": true
+               },
+               "node_modules/jsonparse": {
+                       "version": "1.3.1",
+                       "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+                       "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+                       "dev": true,
+                       "engines": [
+                               "node >= 0.2.0"
+                       ]
+               },
+               "node_modules/keyv": {
+                       "version": "4.5.4",
+                       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+                       "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+                       "dev": true,
+                       "dependencies": {
+                               "json-buffer": "3.0.1"
+                       }
+               },
+               "node_modules/kind-of": {
+                       "version": "6.0.3",
+                       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+                       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/klaw": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+                       "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+                       "dev": true,
+                       "dependencies": {
+                               "graceful-fs": "^4.1.9"
+                       }
+               },
+               "node_modules/kleur": {
+                       "version": "4.1.5",
+                       "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+                       "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/latest-version": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
+                       "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
+                       "dev": true,
+                       "dependencies": {
+                               "package-json": "^8.1.0"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/lerc": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz",
+                       "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww=="
+               },
+               "node_modules/lilconfig": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+                       "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/linkify-it": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
+                       "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "uc.micro": "^1.0.1"
+                       }
+               },
+               "node_modules/loader-runner": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+                       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6.11.5"
+                       }
+               },
+               "node_modules/locate-path": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+                       "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+                       "dev": true,
+                       "dependencies": {
+                               "p-locate": "^5.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/lodash": {
+                       "version": "4.17.21",
+                       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+                       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+                       "dev": true
+               },
+               "node_modules/lodash.memoize": {
+                       "version": "4.1.2",
+                       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+                       "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+                       "dev": true
+               },
+               "node_modules/lodash.uniq": {
+                       "version": "4.5.0",
+                       "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+                       "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+                       "dev": true
+               },
+               "node_modules/lower-case": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+                       "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+                       "dev": true,
+                       "dependencies": {
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "node_modules/lowercase-keys": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+                       "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/lru-cache": {
+                       "version": "7.18.3",
+                       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+                       "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12"
+                       }
+               },
+               "node_modules/make-fetch-happen": {
+                       "version": "11.1.1",
+                       "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+                       "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
+                       "dev": true,
+                       "dependencies": {
+                               "agentkeepalive": "^4.2.1",
+                               "cacache": "^17.0.0",
+                               "http-cache-semantics": "^4.1.1",
+                               "http-proxy-agent": "^5.0.0",
+                               "https-proxy-agent": "^5.0.0",
+                               "is-lambda": "^1.0.1",
+                               "lru-cache": "^7.7.1",
+                               "minipass": "^5.0.0",
+                               "minipass-fetch": "^3.0.0",
+                               "minipass-flush": "^1.0.5",
+                               "minipass-pipeline": "^1.2.4",
+                               "negotiator": "^0.6.3",
+                               "promise-retry": "^2.0.1",
+                               "socks-proxy-agent": "^7.0.0",
+                               "ssri": "^10.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/markdown-it": {
+                       "version": "12.3.2",
+                       "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
+                       "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+                       "dev": true,
+                       "dependencies": {
+                               "argparse": "^2.0.1",
+                               "entities": "~2.1.0",
+                               "linkify-it": "^3.0.1",
+                               "mdurl": "^1.0.1",
+                               "uc.micro": "^1.0.5"
+                       },
+                       "bin": {
+                               "markdown-it": "bin/markdown-it.js"
+                       }
+               },
+               "node_modules/markdown-it-anchor": {
+                       "version": "8.6.7",
+                       "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
+                       "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
+                       "dev": true,
+                       "peerDependencies": {
+                               "@types/markdown-it": "*",
+                               "markdown-it": "*"
+                       }
+               },
+               "node_modules/marked": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+                       "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+                       "dev": true,
+                       "bin": {
+                               "marked": "bin/marked.js"
+                       },
+                       "engines": {
+                               "node": ">= 12"
+                       }
+               },
+               "node_modules/mdn-data": {
+                       "version": "2.0.30",
+                       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+                       "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+                       "dev": true
+               },
+               "node_modules/mdurl": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+                       "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+                       "dev": true
+               },
+               "node_modules/merge-stream": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+                       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+                       "dev": true
+               },
+               "node_modules/merge2": {
+                       "version": "1.4.1",
+                       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+                       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/micromatch": {
+                       "version": "4.0.5",
+                       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+                       "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+                       "dev": true,
+                       "dependencies": {
+                               "braces": "^3.0.2",
+                               "picomatch": "^2.3.1"
+                       },
+                       "engines": {
+                               "node": ">=8.6"
+                       }
+               },
+               "node_modules/mime-db": {
+                       "version": "1.52.0",
+                       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+                       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 0.6"
+                       }
+               },
+               "node_modules/mime-types": {
+                       "version": "2.1.35",
+                       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+                       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+                       "dev": true,
+                       "dependencies": {
+                               "mime-db": "1.52.0"
+                       },
+                       "engines": {
+                               "node": ">= 0.6"
+                       }
+               },
+               "node_modules/mimic-response": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+                       "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/mini-css-extract-plugin": {
+                       "version": "2.7.6",
+                       "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz",
+                       "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==",
+                       "dev": true,
+                       "dependencies": {
+                               "schema-utils": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 12.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       },
+                       "peerDependencies": {
+                               "webpack": "^5.0.0"
+                       }
+               },
+               "node_modules/minimatch": {
+                       "version": "9.0.3",
+                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+                       "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+                       "dev": true,
+                       "dependencies": {
+                               "brace-expansion": "^2.0.1"
+                       },
+                       "engines": {
+                               "node": ">=16 || 14 >=14.17"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/minimist": {
+                       "version": "1.2.8",
+                       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+                       "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+                       "dev": true,
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/minipass": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+                       "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minipass-collect": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+                       "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/minipass-collect/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minipass-fetch": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
+                       "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==",
+                       "dev": true,
+                       "dependencies": {
+                               "encoding": "^0.1.13",
+                               "minipass": "^7.0.3",
+                               "minipass-sized": "^1.0.3",
+                               "minizlib": "^2.1.2"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       },
+                       "optionalDependencies": {
+                               "encoding": "^0.1.13"
+                       }
+               },
+               "node_modules/minipass-fetch/node_modules/minipass": {
+                       "version": "7.0.4",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=16 || 14 >=14.17"
+                       }
+               },
+               "node_modules/minipass-flush": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+                       "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/minipass-flush/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minipass-json-stream": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
+                       "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
+                       "dev": true,
+                       "dependencies": {
+                               "jsonparse": "^1.3.1",
+                               "minipass": "^3.0.0"
+                       }
+               },
+               "node_modules/minipass-json-stream/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minipass-pipeline": {
+                       "version": "1.2.4",
+                       "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+                       "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minipass-pipeline/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minipass-sized": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+                       "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minipass-sized/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/minizlib": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+                       "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.0.0",
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/minizlib/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/mkdirp": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+                       "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+                       "dev": true,
+                       "bin": {
+                               "mkdirp": "bin/cmd.js"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/ms": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+                       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+                       "dev": true
+               },
+               "node_modules/nanoid": {
+                       "version": "3.3.7",
+                       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+                       "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/ai"
+                               }
+                       ],
+                       "bin": {
+                               "nanoid": "bin/nanoid.cjs"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+                       }
+               },
+               "node_modules/negotiator": {
+                       "version": "0.6.3",
+                       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+                       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 0.6"
+                       }
+               },
+               "node_modules/neo-async": {
+                       "version": "2.6.2",
+                       "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+                       "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+                       "dev": true
+               },
+               "node_modules/no-case": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+                       "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+                       "dev": true,
+                       "dependencies": {
+                               "lower-case": "^2.0.2",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "node_modules/node-gyp": {
+                       "version": "9.4.1",
+                       "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz",
+                       "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "env-paths": "^2.2.0",
+                               "exponential-backoff": "^3.1.1",
+                               "glob": "^7.1.4",
+                               "graceful-fs": "^4.2.6",
+                               "make-fetch-happen": "^10.0.3",
+                               "nopt": "^6.0.0",
+                               "npmlog": "^6.0.0",
+                               "rimraf": "^3.0.2",
+                               "semver": "^7.3.5",
+                               "tar": "^6.1.2",
+                               "which": "^2.0.2"
+                       },
+                       "bin": {
+                               "node-gyp": "bin/node-gyp.js"
+                       },
+                       "engines": {
+                               "node": "^12.13 || ^14.13 || >=16"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/@npmcli/fs": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz",
+                       "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@gar/promisify": "^1.1.3",
+                               "semver": "^7.3.5"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/brace-expansion": {
+                       "version": "1.1.11",
+                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+                       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+                       "dev": true,
+                       "dependencies": {
+                               "balanced-match": "^1.0.0",
+                               "concat-map": "0.0.1"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/cacache": {
+                       "version": "16.1.3",
+                       "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
+                       "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@npmcli/fs": "^2.1.0",
+                               "@npmcli/move-file": "^2.0.0",
+                               "chownr": "^2.0.0",
+                               "fs-minipass": "^2.1.0",
+                               "glob": "^8.0.1",
+                               "infer-owner": "^1.0.4",
+                               "lru-cache": "^7.7.1",
+                               "minipass": "^3.1.6",
+                               "minipass-collect": "^1.0.2",
+                               "minipass-flush": "^1.0.5",
+                               "minipass-pipeline": "^1.2.4",
+                               "mkdirp": "^1.0.4",
+                               "p-map": "^4.0.0",
+                               "promise-inflight": "^1.0.1",
+                               "rimraf": "^3.0.2",
+                               "ssri": "^9.0.0",
+                               "tar": "^6.1.11",
+                               "unique-filename": "^2.0.0"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+                       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+                       "dev": true,
+                       "dependencies": {
+                               "balanced-match": "^1.0.0"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/cacache/node_modules/glob": {
+                       "version": "8.1.0",
+                       "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+                       "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "fs.realpath": "^1.0.0",
+                               "inflight": "^1.0.4",
+                               "inherits": "2",
+                               "minimatch": "^5.0.1",
+                               "once": "^1.3.0"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": {
+                       "version": "5.1.6",
+                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+                       "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+                       "dev": true,
+                       "dependencies": {
+                               "brace-expansion": "^2.0.1"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/fs-minipass": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+                       "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/glob": {
+                       "version": "7.2.3",
+                       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+                       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "fs.realpath": "^1.0.0",
+                               "inflight": "^1.0.4",
+                               "inherits": "2",
+                               "minimatch": "^3.1.1",
+                               "once": "^1.3.0",
+                               "path-is-absolute": "^1.0.0"
+                       },
+                       "engines": {
+                               "node": "*"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/make-fetch-happen": {
+                       "version": "10.2.1",
+                       "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz",
+                       "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==",
+                       "dev": true,
+                       "dependencies": {
+                               "agentkeepalive": "^4.2.1",
+                               "cacache": "^16.1.0",
+                               "http-cache-semantics": "^4.1.0",
+                               "http-proxy-agent": "^5.0.0",
+                               "https-proxy-agent": "^5.0.0",
+                               "is-lambda": "^1.0.1",
+                               "lru-cache": "^7.7.1",
+                               "minipass": "^3.1.6",
+                               "minipass-collect": "^1.0.2",
+                               "minipass-fetch": "^2.0.3",
+                               "minipass-flush": "^1.0.5",
+                               "minipass-pipeline": "^1.2.4",
+                               "negotiator": "^0.6.3",
+                               "promise-retry": "^2.0.1",
+                               "socks-proxy-agent": "^7.0.0",
+                               "ssri": "^9.0.0"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/minimatch": {
+                       "version": "3.1.2",
+                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+                       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+                       "dev": true,
+                       "dependencies": {
+                               "brace-expansion": "^1.1.7"
+                       },
+                       "engines": {
+                               "node": "*"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/minipass-fetch": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
+                       "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
+                       "dev": true,
+                       "dependencies": {
+                               "encoding": "^0.1.13",
+                               "minipass": "^3.1.6",
+                               "minipass-sized": "^1.0.3",
+                               "minizlib": "^2.1.2"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       },
+                       "optionalDependencies": {
+                               "encoding": "^0.1.13"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/rimraf": {
+                       "version": "3.0.2",
+                       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+                       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+                       "dev": true,
+                       "dependencies": {
+                               "glob": "^7.1.3"
+                       },
+                       "bin": {
+                               "rimraf": "bin.js"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/ssri": {
+                       "version": "9.0.1",
+                       "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
+                       "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.1.1"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/unique-filename": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",
+                       "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
+                       "dev": true,
+                       "dependencies": {
+                               "unique-slug": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/node-gyp/node_modules/unique-slug": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
+                       "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
+                       "dev": true,
+                       "dependencies": {
+                               "imurmurhash": "^0.1.4"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/node-releases": {
+                       "version": "2.0.14",
+                       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+                       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+                       "dev": true
+               },
+               "node_modules/nopt": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
+                       "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
+                       "dev": true,
+                       "dependencies": {
+                               "abbrev": "^1.0.0"
+                       },
+                       "bin": {
+                               "nopt": "bin/nopt.js"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/normalize-package-data": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz",
+                       "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "hosted-git-info": "^6.0.0",
+                               "is-core-module": "^2.8.1",
+                               "semver": "^7.3.5",
+                               "validate-npm-package-license": "^3.0.4"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/normalize-package-data/node_modules/hosted-git-info": {
+                       "version": "6.1.1",
+                       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz",
+                       "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==",
+                       "dev": true,
+                       "dependencies": {
+                               "lru-cache": "^7.5.1"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/normalize-url": {
+                       "version": "8.0.0",
+                       "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
+                       "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/npm-bundled": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz",
+                       "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "npm-normalize-package-bin": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npm-check-updates": {
+                       "version": "16.14.12",
+                       "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.12.tgz",
+                       "integrity": "sha512-5FvqaDX8AqWWTDQFbBllgLwoRXTvzlqVIRSKl9Kg8bYZTfNwMnrp1Zlmb5e/ocf11UjPTc+ShBFjYQ7kg6FL0w==",
+                       "dev": true,
+                       "dependencies": {
+                               "chalk": "^5.3.0",
+                               "cli-table3": "^0.6.3",
+                               "commander": "^10.0.1",
+                               "fast-memoize": "^2.5.2",
+                               "find-up": "5.0.0",
+                               "fp-and-or": "^0.1.4",
+                               "get-stdin": "^8.0.0",
+                               "globby": "^11.0.4",
+                               "hosted-git-info": "^5.1.0",
+                               "ini": "^4.1.1",
+                               "js-yaml": "^4.1.0",
+                               "json-parse-helpfulerror": "^1.0.3",
+                               "jsonlines": "^0.1.1",
+                               "lodash": "^4.17.21",
+                               "make-fetch-happen": "^11.1.1",
+                               "minimatch": "^9.0.3",
+                               "p-map": "^4.0.0",
+                               "pacote": "15.2.0",
+                               "parse-github-url": "^1.0.2",
+                               "progress": "^2.0.3",
+                               "prompts-ncu": "^3.0.0",
+                               "rc-config-loader": "^4.1.3",
+                               "remote-git-tags": "^3.0.0",
+                               "rimraf": "^5.0.5",
+                               "semver": "^7.5.4",
+                               "semver-utils": "^1.1.4",
+                               "source-map-support": "^0.5.21",
+                               "spawn-please": "^2.0.2",
+                               "strip-ansi": "^7.1.0",
+                               "strip-json-comments": "^5.0.1",
+                               "untildify": "^4.0.0",
+                               "update-notifier": "^6.0.2"
+                       },
+                       "bin": {
+                               "ncu": "build/src/bin/cli.js",
+                               "npm-check-updates": "build/src/bin/cli.js"
+                       },
+                       "engines": {
+                               "node": ">=14.14"
+                       }
+               },
+               "node_modules/npm-check-updates/node_modules/chalk": {
+                       "version": "5.3.0",
+                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+                       "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^12.17.0 || ^14.13 || >=16.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/chalk?sponsor=1"
+                       }
+               },
+               "node_modules/npm-check-updates/node_modules/commander": {
+                       "version": "10.0.1",
+                       "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+                       "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14"
+                       }
+               },
+               "node_modules/npm-check-updates/node_modules/strip-json-comments": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz",
+                       "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/npm-install-checks": {
+                       "version": "6.3.0",
+                       "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz",
+                       "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
+                       "dev": true,
+                       "dependencies": {
+                               "semver": "^7.1.1"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npm-normalize-package-bin": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+                       "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npm-package-arg": {
+                       "version": "10.1.0",
+                       "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz",
+                       "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==",
+                       "dev": true,
+                       "dependencies": {
+                               "hosted-git-info": "^6.0.0",
+                               "proc-log": "^3.0.0",
+                               "semver": "^7.3.5",
+                               "validate-npm-package-name": "^5.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npm-package-arg/node_modules/hosted-git-info": {
+                       "version": "6.1.1",
+                       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz",
+                       "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==",
+                       "dev": true,
+                       "dependencies": {
+                               "lru-cache": "^7.5.1"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npm-packlist": {
+                       "version": "7.0.4",
+                       "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz",
+                       "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "ignore-walk": "^6.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npm-pick-manifest": {
+                       "version": "8.0.2",
+                       "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz",
+                       "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==",
+                       "dev": true,
+                       "dependencies": {
+                               "npm-install-checks": "^6.0.0",
+                               "npm-normalize-package-bin": "^3.0.0",
+                               "npm-package-arg": "^10.0.0",
+                               "semver": "^7.3.5"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npm-registry-fetch": {
+                       "version": "14.0.5",
+                       "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz",
+                       "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==",
+                       "dev": true,
+                       "dependencies": {
+                               "make-fetch-happen": "^11.0.0",
+                               "minipass": "^5.0.0",
+                               "minipass-fetch": "^3.0.0",
+                               "minipass-json-stream": "^1.0.1",
+                               "minizlib": "^2.1.2",
+                               "npm-package-arg": "^10.0.0",
+                               "proc-log": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/npmlog": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+                       "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+                       "dev": true,
+                       "dependencies": {
+                               "are-we-there-yet": "^3.0.0",
+                               "console-control-strings": "^1.1.0",
+                               "gauge": "^4.0.3",
+                               "set-blocking": "^2.0.0"
+                       },
+                       "engines": {
+                               "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+                       }
+               },
+               "node_modules/nth-check": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+                       "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+                       "dev": true,
+                       "dependencies": {
+                               "boolbase": "^1.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/fb55/nth-check?sponsor=1"
+                       }
+               },
+               "node_modules/ol": {
+                       "version": "8.2.0",
+                       "resolved": "https://registry.npmjs.org/ol/-/ol-8.2.0.tgz",
+                       "integrity": "sha512-/m1ddd7Jsp4Kbg+l7+ozR5aKHAZNQOBAoNZ5pM9Jvh4Etkf0WGkXr9qXd7PnhmwiC1Hnc2Toz9XjCzBBvexfXw==",
+                       "dependencies": {
+                               "color-rgba": "^3.0.0",
+                               "color-space": "^2.0.1",
+                               "earcut": "^2.2.3",
+                               "geotiff": "^2.0.7",
+                               "pbf": "3.2.1",
+                               "rbush": "^3.0.1"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/openlayers"
+                       }
+               },
+               "node_modules/once": {
+                       "version": "1.4.0",
+                       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+                       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+                       "dev": true,
+                       "dependencies": {
+                               "wrappy": "1"
+                       }
+               },
+               "node_modules/p-cancelable": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+                       "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12.20"
+                       }
+               },
+               "node_modules/p-limit": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+                       "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "yocto-queue": "^0.1.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/p-locate": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+                       "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+                       "dev": true,
+                       "dependencies": {
+                               "p-limit": "^3.0.2"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/p-map": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+                       "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "aggregate-error": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/p-try": {
+                       "version": "2.2.0",
+                       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+                       "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/package-json": {
+                       "version": "8.1.1",
+                       "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz",
+                       "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==",
+                       "dev": true,
+                       "dependencies": {
+                               "got": "^12.1.0",
+                               "registry-auth-token": "^5.0.1",
+                               "registry-url": "^6.0.0",
+                               "semver": "^7.3.7"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/pacote": {
+                       "version": "15.2.0",
+                       "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz",
+                       "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@npmcli/git": "^4.0.0",
+                               "@npmcli/installed-package-contents": "^2.0.1",
+                               "@npmcli/promise-spawn": "^6.0.1",
+                               "@npmcli/run-script": "^6.0.0",
+                               "cacache": "^17.0.0",
+                               "fs-minipass": "^3.0.0",
+                               "minipass": "^5.0.0",
+                               "npm-package-arg": "^10.0.0",
+                               "npm-packlist": "^7.0.0",
+                               "npm-pick-manifest": "^8.0.0",
+                               "npm-registry-fetch": "^14.0.0",
+                               "proc-log": "^3.0.0",
+                               "promise-retry": "^2.0.1",
+                               "read-package-json": "^6.0.0",
+                               "read-package-json-fast": "^3.0.0",
+                               "sigstore": "^1.3.0",
+                               "ssri": "^10.0.0",
+                               "tar": "^6.1.11"
+                       },
+                       "bin": {
+                               "pacote": "lib/bin.js"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/pako": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
+                       "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
+               },
+               "node_modules/param-case": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+                       "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+                       "dev": true,
+                       "dependencies": {
+                               "dot-case": "^3.0.4",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "node_modules/parse-github-url": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz",
+                       "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==",
+                       "dev": true,
+                       "bin": {
+                               "parse-github-url": "cli.js"
+                       },
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/parse-headers": {
+                       "version": "2.0.5",
+                       "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+                       "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+               },
+               "node_modules/pascal-case": {
+                       "version": "3.1.2",
+                       "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+                       "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+                       "dev": true,
+                       "dependencies": {
+                               "no-case": "^3.0.4",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "node_modules/path-exists": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+                       "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/path-is-absolute": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+                       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/path-key": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+                       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/path-parse": {
+                       "version": "1.0.7",
+                       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+                       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+                       "dev": true
+               },
+               "node_modules/path-scurry": {
+                       "version": "1.10.1",
+                       "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+                       "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "lru-cache": "^9.1.1 || ^10.0.0",
+                               "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+                       },
+                       "engines": {
+                               "node": ">=16 || 14 >=14.17"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/path-scurry/node_modules/lru-cache": {
+                       "version": "10.1.0",
+                       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+                       "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+                       "dev": true,
+                       "engines": {
+                               "node": "14 || >=16.14"
+                       }
+               },
+               "node_modules/path-type": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+                       "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/pbf": {
+                       "version": "3.2.1",
+                       "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+                       "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+                       "dependencies": {
+                               "ieee754": "^1.1.12",
+                               "resolve-protobuf-schema": "^2.1.0"
+                       },
+                       "bin": {
+                               "pbf": "bin/pbf"
+                       }
+               },
+               "node_modules/picocolors": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+                       "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+                       "dev": true
+               },
+               "node_modules/picomatch": {
+                       "version": "2.3.1",
+                       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+                       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8.6"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/jonschlinkert"
+                       }
+               },
+               "node_modules/pkg-dir": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+                       "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "find-up": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/pkg-dir/node_modules/find-up": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+                       "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+                       "dev": true,
+                       "dependencies": {
+                               "locate-path": "^5.0.0",
+                               "path-exists": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/pkg-dir/node_modules/locate-path": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+                       "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+                       "dev": true,
+                       "dependencies": {
+                               "p-locate": "^4.1.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/pkg-dir/node_modules/p-limit": {
+                       "version": "2.3.0",
+                       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+                       "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+                       "dev": true,
+                       "dependencies": {
+                               "p-try": "^2.0.0"
+                       },
+                       "engines": {
+                               "node": ">=6"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/pkg-dir/node_modules/p-locate": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+                       "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+                       "dev": true,
+                       "dependencies": {
+                               "p-limit": "^2.2.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/postcss": {
+                       "version": "8.4.32",
+                       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+                       "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "opencollective",
+                                       "url": "https://opencollective.com/postcss/"
+                               },
+                               {
+                                       "type": "tidelift",
+                                       "url": "https://tidelift.com/funding/github/npm/postcss"
+                               },
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/ai"
+                               }
+                       ],
+                       "dependencies": {
+                               "nanoid": "^3.3.7",
+                               "picocolors": "^1.0.0",
+                               "source-map-js": "^1.0.2"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12 || >=14"
+                       }
+               },
+               "node_modules/postcss-calc": {
+                       "version": "9.0.1",
+                       "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
+                       "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-selector-parser": "^6.0.11",
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.2"
+                       }
+               },
+               "node_modules/postcss-colormin": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz",
+                       "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.21.4",
+                               "caniuse-api": "^3.0.0",
+                               "colord": "^2.9.1",
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-convert-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz",
+                       "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.21.4",
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-discard-comments": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz",
+                       "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-discard-duplicates": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz",
+                       "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-discard-empty": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz",
+                       "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-discard-overridden": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz",
+                       "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-merge-longhand": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz",
+                       "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0",
+                               "stylehacks": "^6.0.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-merge-rules": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz",
+                       "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.21.4",
+                               "caniuse-api": "^3.0.0",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-selector-parser": "^6.0.5"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-minify-font-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz",
+                       "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-minify-gradients": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz",
+                       "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==",
+                       "dev": true,
+                       "dependencies": {
+                               "colord": "^2.9.1",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-minify-params": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz",
+                       "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.21.4",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-minify-selectors": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz",
+                       "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-selector-parser": "^6.0.5"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-modules-extract-imports": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+                       "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^10 || ^12 || >= 14"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.1.0"
+                       }
+               },
+               "node_modules/postcss-modules-local-by-default": {
+                       "version": "4.0.3",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
+                       "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
+                       "dev": true,
+                       "dependencies": {
+                               "icss-utils": "^5.0.0",
+                               "postcss-selector-parser": "^6.0.2",
+                               "postcss-value-parser": "^4.1.0"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12 || >= 14"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.1.0"
+                       }
+               },
+               "node_modules/postcss-modules-scope": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+                       "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-selector-parser": "^6.0.4"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12 || >= 14"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.1.0"
+                       }
+               },
+               "node_modules/postcss-modules-values": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+                       "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "icss-utils": "^5.0.0"
+                       },
+                       "engines": {
+                               "node": "^10 || ^12 || >= 14"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.1.0"
+                       }
+               },
+               "node_modules/postcss-normalize-charset": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz",
+                       "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-display-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz",
+                       "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-positions": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz",
+                       "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-repeat-style": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz",
+                       "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-string": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz",
+                       "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-timing-functions": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz",
+                       "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-unicode": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz",
+                       "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.21.4",
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-url": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz",
+                       "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-normalize-whitespace": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz",
+                       "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-ordered-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz",
+                       "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==",
+                       "dev": true,
+                       "dependencies": {
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-reduce-initial": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz",
+                       "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.21.4",
+                               "caniuse-api": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-reduce-transforms": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz",
+                       "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-selector-parser": {
+                       "version": "6.0.13",
+                       "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+                       "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "cssesc": "^3.0.0",
+                               "util-deprecate": "^1.0.2"
+                       },
+                       "engines": {
+                               "node": ">=4"
+                       }
+               },
+               "node_modules/postcss-svgo": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz",
+                       "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-value-parser": "^4.2.0",
+                               "svgo": "^3.0.2"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >= 18"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-unique-selectors": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz",
+                       "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==",
+                       "dev": true,
+                       "dependencies": {
+                               "postcss-selector-parser": "^6.0.5"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/postcss-value-parser": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+                       "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+                       "dev": true
+               },
+               "node_modules/pretty-error": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+                       "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+                       "dev": true,
+                       "dependencies": {
+                               "lodash": "^4.17.20",
+                               "renderkid": "^3.0.0"
+                       }
+               },
+               "node_modules/proc-log": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+                       "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/progress": {
+                       "version": "2.0.3",
+                       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+                       "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.4.0"
+                       }
+               },
+               "node_modules/promise-inflight": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+                       "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+                       "dev": true
+               },
+               "node_modules/promise-retry": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+                       "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+                       "dev": true,
+                       "dependencies": {
+                               "err-code": "^2.0.2",
+                               "retry": "^0.12.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/prompts-ncu": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz",
+                       "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==",
+                       "dev": true,
+                       "dependencies": {
+                               "kleur": "^4.0.1",
+                               "sisteransi": "^1.0.5"
+                       },
+                       "engines": {
+                               "node": ">= 14"
+                       }
+               },
+               "node_modules/proto-list": {
+                       "version": "1.2.4",
+                       "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+                       "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+                       "dev": true
+               },
+               "node_modules/protocol-buffers-schema": {
+                       "version": "3.6.0",
+                       "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+                       "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+               },
+               "node_modules/punycode": {
+                       "version": "2.3.1",
+                       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+                       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/pupa": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz",
+                       "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==",
+                       "dev": true,
+                       "dependencies": {
+                               "escape-goat": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=12.20"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/queue-microtask": {
+                       "version": "1.2.3",
+                       "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+                       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/feross"
+                               },
+                               {
+                                       "type": "patreon",
+                                       "url": "https://www.patreon.com/feross"
+                               },
+                               {
+                                       "type": "consulting",
+                                       "url": "https://feross.org/support"
+                               }
+                       ]
+               },
+               "node_modules/quick-lru": {
+                       "version": "6.1.2",
+                       "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
+                       "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==",
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/quickselect": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+                       "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+               },
+               "node_modules/randombytes": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+                       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "safe-buffer": "^5.1.0"
+                       }
+               },
+               "node_modules/rbush": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
+                       "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+                       "dependencies": {
+                               "quickselect": "^2.0.0"
+                       }
+               },
+               "node_modules/rc": {
+                       "version": "1.2.8",
+                       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+                       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+                       "dev": true,
+                       "dependencies": {
+                               "deep-extend": "^0.6.0",
+                               "ini": "~1.3.0",
+                               "minimist": "^1.2.0",
+                               "strip-json-comments": "~2.0.1"
+                       },
+                       "bin": {
+                               "rc": "cli.js"
+                       }
+               },
+               "node_modules/rc-config-loader": {
+                       "version": "4.1.3",
+                       "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz",
+                       "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==",
+                       "dev": true,
+                       "dependencies": {
+                               "debug": "^4.3.4",
+                               "js-yaml": "^4.1.0",
+                               "json5": "^2.2.2",
+                               "require-from-string": "^2.0.2"
+                       }
+               },
+               "node_modules/rc/node_modules/ini": {
+                       "version": "1.3.8",
+                       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+                       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+                       "dev": true
+               },
+               "node_modules/rc/node_modules/strip-json-comments": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+                       "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/read-package-json": {
+                       "version": "6.0.4",
+                       "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz",
+                       "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==",
+                       "dev": true,
+                       "dependencies": {
+                               "glob": "^10.2.2",
+                               "json-parse-even-better-errors": "^3.0.0",
+                               "normalize-package-data": "^5.0.0",
+                               "npm-normalize-package-bin": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/read-package-json-fast": {
+                       "version": "3.0.2",
+                       "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+                       "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
+                       "dev": true,
+                       "dependencies": {
+                               "json-parse-even-better-errors": "^3.0.0",
+                               "npm-normalize-package-bin": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/readable-stream": {
+                       "version": "3.6.2",
+                       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+                       "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+                       "dev": true,
+                       "dependencies": {
+                               "inherits": "^2.0.3",
+                               "string_decoder": "^1.1.1",
+                               "util-deprecate": "^1.0.1"
+                       },
+                       "engines": {
+                               "node": ">= 6"
+                       }
+               },
+               "node_modules/rechoir": {
+                       "version": "0.8.0",
+                       "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+                       "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "resolve": "^1.20.0"
+                       },
+                       "engines": {
+                               "node": ">= 10.13.0"
+                       }
+               },
+               "node_modules/registry-auth-token": {
+                       "version": "5.0.2",
+                       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz",
+                       "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@pnpm/npm-conf": "^2.1.0"
+                       },
+                       "engines": {
+                               "node": ">=14"
+                       }
+               },
+               "node_modules/registry-url": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
+                       "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "rc": "1.2.8"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/relateurl": {
+                       "version": "0.2.7",
+                       "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+                       "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 0.10"
+                       }
+               },
+               "node_modules/remote-git-tags": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz",
+                       "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/renderkid": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+                       "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+                       "dev": true,
+                       "dependencies": {
+                               "css-select": "^4.1.3",
+                               "dom-converter": "^0.2.0",
+                               "htmlparser2": "^6.1.0",
+                               "lodash": "^4.17.21",
+                               "strip-ansi": "^6.0.1"
+                       }
+               },
+               "node_modules/renderkid/node_modules/ansi-regex": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/renderkid/node_modules/strip-ansi": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/require-from-string": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+                       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/requizzle": {
+                       "version": "0.2.4",
+                       "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+                       "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
+                       "dev": true,
+                       "dependencies": {
+                               "lodash": "^4.17.21"
+                       }
+               },
+               "node_modules/resolve": {
+                       "version": "1.22.8",
+                       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+                       "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-core-module": "^2.13.0",
+                               "path-parse": "^1.0.7",
+                               "supports-preserve-symlinks-flag": "^1.0.0"
+                       },
+                       "bin": {
+                               "resolve": "bin/resolve"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/resolve-alpn": {
+                       "version": "1.2.1",
+                       "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+                       "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+                       "dev": true
+               },
+               "node_modules/resolve-cwd": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+                       "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+                       "dev": true,
+                       "dependencies": {
+                               "resolve-from": "^5.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/resolve-from": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+                       "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/resolve-protobuf-schema": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+                       "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+                       "dependencies": {
+                               "protocol-buffers-schema": "^3.3.1"
+                       }
+               },
+               "node_modules/responselike": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+                       "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+                       "dev": true,
+                       "dependencies": {
+                               "lowercase-keys": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/retry": {
+                       "version": "0.12.0",
+                       "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+                       "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 4"
+                       }
+               },
+               "node_modules/reusify": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+                       "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+                       "dev": true,
+                       "engines": {
+                               "iojs": ">=1.0.0",
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/rimraf": {
+                       "version": "5.0.5",
+                       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz",
+                       "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==",
+                       "dev": true,
+                       "dependencies": {
+                               "glob": "^10.3.7"
+                       },
+                       "bin": {
+                               "rimraf": "dist/esm/bin.mjs"
+                       },
+                       "engines": {
+                               "node": ">=14"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/run-parallel": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+                       "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/feross"
+                               },
+                               {
+                                       "type": "patreon",
+                                       "url": "https://www.patreon.com/feross"
+                               },
+                               {
+                                       "type": "consulting",
+                                       "url": "https://feross.org/support"
+                               }
+                       ],
+                       "dependencies": {
+                               "queue-microtask": "^1.2.2"
+                       }
+               },
+               "node_modules/safe-buffer": {
+                       "version": "5.2.1",
+                       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+                       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/feross"
+                               },
+                               {
+                                       "type": "patreon",
+                                       "url": "https://www.patreon.com/feross"
+                               },
+                               {
+                                       "type": "consulting",
+                                       "url": "https://feross.org/support"
+                               }
+                       ]
+               },
+               "node_modules/safer-buffer": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+                       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+                       "dev": true,
+                       "optional": true
+               },
+               "node_modules/schema-utils": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
+                       "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/json-schema": "^7.0.9",
+                               "ajv": "^8.9.0",
+                               "ajv-formats": "^2.1.1",
+                               "ajv-keywords": "^5.1.0"
+                       },
+                       "engines": {
+                               "node": ">= 12.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       }
+               },
+               "node_modules/semver": {
+                       "version": "7.5.4",
+                       "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+                       "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+                       "dev": true,
+                       "dependencies": {
+                               "lru-cache": "^6.0.0"
+                       },
+                       "bin": {
+                               "semver": "bin/semver.js"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/semver-diff": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
+                       "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
+                       "dev": true,
+                       "dependencies": {
+                               "semver": "^7.3.5"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/semver-utils": {
+                       "version": "1.1.4",
+                       "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz",
+                       "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==",
+                       "dev": true
+               },
+               "node_modules/semver/node_modules/lru-cache": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                       "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/serialize-javascript": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+                       "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+                       "dev": true,
+                       "dependencies": {
+                               "randombytes": "^2.1.0"
+                       }
+               },
+               "node_modules/set-blocking": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+                       "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+                       "dev": true
+               },
+               "node_modules/shallow-clone": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+                       "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+                       "dev": true,
+                       "dependencies": {
+                               "kind-of": "^6.0.2"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/shebang-command": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+                       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+                       "dev": true,
+                       "dependencies": {
+                               "shebang-regex": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/shebang-regex": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+                       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/signal-exit": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+                       "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/isaacs"
+                       }
+               },
+               "node_modules/sigstore": {
+                       "version": "1.9.0",
+                       "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz",
+                       "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==",
+                       "dev": true,
+                       "dependencies": {
+                               "@sigstore/bundle": "^1.1.0",
+                               "@sigstore/protobuf-specs": "^0.2.0",
+                               "@sigstore/sign": "^1.0.0",
+                               "@sigstore/tuf": "^1.0.3",
+                               "make-fetch-happen": "^11.0.1"
+                       },
+                       "bin": {
+                               "sigstore": "bin/sigstore.js"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/sisteransi": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+                       "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+                       "dev": true
+               },
+               "node_modules/slash": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+                       "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/smart-buffer": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+                       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 6.0.0",
+                               "npm": ">= 3.0.0"
+                       }
+               },
+               "node_modules/socks": {
+                       "version": "2.7.1",
+                       "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+                       "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ip": "^2.0.0",
+                               "smart-buffer": "^4.2.0"
+                       },
+                       "engines": {
+                               "node": ">= 10.13.0",
+                               "npm": ">= 3.0.0"
+                       }
+               },
+               "node_modules/socks-proxy-agent": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
+                       "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
+                       "dev": true,
+                       "dependencies": {
+                               "agent-base": "^6.0.2",
+                               "debug": "^4.3.3",
+                               "socks": "^2.6.2"
+                       },
+                       "engines": {
+                               "node": ">= 10"
+                       }
+               },
+               "node_modules/source-map": {
+                       "version": "0.6.1",
+                       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+                       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/source-map-js": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+                       "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.10.0"
+                       }
+               },
+               "node_modules/source-map-support": {
+                       "version": "0.5.21",
+                       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+                       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+                       "dev": true,
+                       "dependencies": {
+                               "buffer-from": "^1.0.0",
+                               "source-map": "^0.6.0"
+                       }
+               },
+               "node_modules/spawn-please": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz",
+                       "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==",
+                       "dev": true,
+                       "dependencies": {
+                               "cross-spawn": "^7.0.3"
+                       },
+                       "engines": {
+                               "node": ">=14"
+                       }
+               },
+               "node_modules/spdx-correct": {
+                       "version": "3.2.0",
+                       "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+                       "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+                       "dev": true,
+                       "dependencies": {
+                               "spdx-expression-parse": "^3.0.0",
+                               "spdx-license-ids": "^3.0.0"
+                       }
+               },
+               "node_modules/spdx-exceptions": {
+                       "version": "2.3.0",
+                       "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+                       "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+                       "dev": true
+               },
+               "node_modules/spdx-expression-parse": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+                       "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "spdx-exceptions": "^2.1.0",
+                               "spdx-license-ids": "^3.0.0"
+                       }
+               },
+               "node_modules/spdx-license-ids": {
+                       "version": "3.0.16",
+                       "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
+                       "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+                       "dev": true
+               },
+               "node_modules/ssri": {
+                       "version": "10.0.5",
+                       "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz",
+                       "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^7.0.3"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/ssri/node_modules/minipass": {
+                       "version": "7.0.4",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=16 || 14 >=14.17"
+                       }
+               },
+               "node_modules/string_decoder": {
+                       "version": "1.3.0",
+                       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+                       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+                       "dev": true,
+                       "dependencies": {
+                               "safe-buffer": "~5.2.0"
+                       }
+               },
+               "node_modules/string-width": {
+                       "version": "4.2.3",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+                       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+                       "dev": true,
+                       "dependencies": {
+                               "emoji-regex": "^8.0.0",
+                               "is-fullwidth-code-point": "^3.0.0",
+                               "strip-ansi": "^6.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/string-width-cjs": {
+                       "name": "string-width",
+                       "version": "4.2.3",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+                       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+                       "dev": true,
+                       "dependencies": {
+                               "emoji-regex": "^8.0.0",
+                               "is-fullwidth-code-point": "^3.0.0",
+                               "strip-ansi": "^6.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/string-width-cjs/node_modules/ansi-regex": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/string-width-cjs/node_modules/strip-ansi": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/string-width/node_modules/ansi-regex": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/string-width/node_modules/strip-ansi": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/strip-ansi": {
+                       "version": "7.1.0",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+                       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^6.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+                       }
+               },
+               "node_modules/strip-ansi-cjs": {
+                       "name": "strip-ansi",
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/strip-json-comments": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+                       "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/style-loader": {
+                       "version": "3.3.3",
+                       "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz",
+                       "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 12.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       },
+                       "peerDependencies": {
+                               "webpack": "^5.0.0"
+                       }
+               },
+               "node_modules/stylehacks": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz",
+                       "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==",
+                       "dev": true,
+                       "dependencies": {
+                               "browserslist": "^4.21.4",
+                               "postcss-selector-parser": "^6.0.4"
+                       },
+                       "engines": {
+                               "node": "^14 || ^16 || >=18.0"
+                       },
+                       "peerDependencies": {
+                               "postcss": "^8.2.15"
+                       }
+               },
+               "node_modules/supports-color": {
+                       "version": "8.1.1",
+                       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+                       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "has-flag": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/supports-color?sponsor=1"
+                       }
+               },
+               "node_modules/supports-preserve-symlinks-flag": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+                       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 0.4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/ljharb"
+                       }
+               },
+               "node_modules/svgo": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.1.0.tgz",
+                       "integrity": "sha512-R5SnNA89w1dYgNv570591F66v34b3eQShpIBcQtZtM5trJwm1VvxbIoMpRYY3ybTAutcKTLEmTsdnaknOHbiQA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@trysound/sax": "0.2.0",
+                               "commander": "^7.2.0",
+                               "css-select": "^5.1.0",
+                               "css-tree": "^2.2.1",
+                               "css-what": "^6.1.0",
+                               "csso": "5.0.5",
+                               "picocolors": "^1.0.0"
+                       },
+                       "bin": {
+                               "svgo": "bin/svgo"
+                       },
+                       "engines": {
+                               "node": ">=14.0.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/svgo"
+                       }
+               },
+               "node_modules/svgo/node_modules/commander": {
+                       "version": "7.2.0",
+                       "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+                       "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">= 10"
+                       }
+               },
+               "node_modules/svgo/node_modules/css-select": {
+                       "version": "5.1.0",
+                       "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+                       "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+                       "dev": true,
+                       "dependencies": {
+                               "boolbase": "^1.0.0",
+                               "css-what": "^6.1.0",
+                               "domhandler": "^5.0.2",
+                               "domutils": "^3.0.1",
+                               "nth-check": "^2.0.1"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/fb55"
+                       }
+               },
+               "node_modules/svgo/node_modules/dom-serializer": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+                       "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+                       "dev": true,
+                       "dependencies": {
+                               "domelementtype": "^2.3.0",
+                               "domhandler": "^5.0.2",
+                               "entities": "^4.2.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+                       }
+               },
+               "node_modules/svgo/node_modules/domhandler": {
+                       "version": "5.0.3",
+                       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+                       "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+                       "dev": true,
+                       "dependencies": {
+                               "domelementtype": "^2.3.0"
+                       },
+                       "engines": {
+                               "node": ">= 4"
+                       },
+                       "funding": {
+                               "url": "https://github.com/fb55/domhandler?sponsor=1"
+                       }
+               },
+               "node_modules/svgo/node_modules/domutils": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+                       "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+                       "dev": true,
+                       "dependencies": {
+                               "dom-serializer": "^2.0.0",
+                               "domelementtype": "^2.3.0",
+                               "domhandler": "^5.0.3"
+                       },
+                       "funding": {
+                               "url": "https://github.com/fb55/domutils?sponsor=1"
+                       }
+               },
+               "node_modules/svgo/node_modules/entities": {
+                       "version": "4.5.0",
+                       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+                       "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=0.12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/fb55/entities?sponsor=1"
+                       }
+               },
+               "node_modules/tapable": {
+                       "version": "2.2.1",
+                       "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+                       "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=6"
+                       }
+               },
+               "node_modules/tar": {
+                       "version": "6.2.0",
+                       "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
+                       "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "chownr": "^2.0.0",
+                               "fs-minipass": "^2.0.0",
+                               "minipass": "^5.0.0",
+                               "minizlib": "^2.1.1",
+                               "mkdirp": "^1.0.3",
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/tar/node_modules/fs-minipass": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+                       "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+                       "dev": true,
+                       "dependencies": {
+                               "minipass": "^3.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+                       "version": "3.3.6",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                       "dev": true,
+                       "dependencies": {
+                               "yallist": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/terser": {
+                       "version": "5.26.0",
+                       "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
+                       "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jridgewell/source-map": "^0.3.3",
+                               "acorn": "^8.8.2",
+                               "commander": "^2.20.0",
+                               "source-map-support": "~0.5.20"
+                       },
+                       "bin": {
+                               "terser": "bin/terser"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       }
+               },
+               "node_modules/terser-webpack-plugin": {
+                       "version": "5.3.9",
+                       "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+                       "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+                       "dev": true,
+                       "dependencies": {
+                               "@jridgewell/trace-mapping": "^0.3.17",
+                               "jest-worker": "^27.4.5",
+                               "schema-utils": "^3.1.1",
+                               "serialize-javascript": "^6.0.1",
+                               "terser": "^5.16.8"
+                       },
+                       "engines": {
+                               "node": ">= 10.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       },
+                       "peerDependencies": {
+                               "webpack": "^5.1.0"
+                       },
+                       "peerDependenciesMeta": {
+                               "@swc/core": {
+                                       "optional": true
+                               },
+                               "esbuild": {
+                                       "optional": true
+                               },
+                               "uglify-js": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/terser-webpack-plugin/node_modules/ajv": {
+                       "version": "6.12.6",
+                       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+                       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+                       "dev": true,
+                       "dependencies": {
+                               "fast-deep-equal": "^3.1.1",
+                               "fast-json-stable-stringify": "^2.0.0",
+                               "json-schema-traverse": "^0.4.1",
+                               "uri-js": "^4.2.2"
+                       },
+                       "funding": {
+                               "type": "github",
+                               "url": "https://github.com/sponsors/epoberezkin"
+                       }
+               },
+               "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
+                       "version": "3.5.2",
+                       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+                       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+                       "dev": true,
+                       "peerDependencies": {
+                               "ajv": "^6.9.1"
+                       }
+               },
+               "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
+                       "version": "27.5.1",
+                       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+                       "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/node": "*",
+                               "merge-stream": "^2.0.0",
+                               "supports-color": "^8.0.0"
+                       },
+                       "engines": {
+                               "node": ">= 10.13.0"
+                       }
+               },
+               "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
+                       "version": "0.4.1",
+                       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+                       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+                       "dev": true
+               },
+               "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+                       "version": "3.3.0",
+                       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+                       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/json-schema": "^7.0.8",
+                               "ajv": "^6.12.5",
+                               "ajv-keywords": "^3.5.2"
+                       },
+                       "engines": {
+                               "node": ">= 10.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       }
+               },
+               "node_modules/terser/node_modules/commander": {
+                       "version": "2.20.3",
+                       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+                       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+                       "dev": true
+               },
+               "node_modules/to-regex-range": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+                       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-number": "^7.0.0"
+                       },
+                       "engines": {
+                               "node": ">=8.0"
+                       }
+               },
+               "node_modules/tslib": {
+                       "version": "2.6.2",
+                       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+                       "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+                       "dev": true
+               },
+               "node_modules/tuf-js": {
+                       "version": "1.1.7",
+                       "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz",
+                       "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@tufjs/models": "1.0.4",
+                               "debug": "^4.3.4",
+                               "make-fetch-happen": "^11.1.1"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/type-fest": {
+                       "version": "2.19.0",
+                       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+                       "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12.20"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/typedarray-to-buffer": {
+                       "version": "3.1.5",
+                       "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+                       "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "is-typedarray": "^1.0.0"
+                       }
+               },
+               "node_modules/uc.micro": {
+                       "version": "1.0.6",
+                       "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+                       "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+                       "dev": true
+               },
+               "node_modules/underscore": {
+                       "version": "1.13.6",
+                       "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+                       "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
+                       "dev": true
+               },
+               "node_modules/undici-types": {
+                       "version": "5.26.5",
+                       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+                       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+                       "dev": true
+               },
+               "node_modules/unique-filename": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+                       "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+                       "dev": true,
+                       "dependencies": {
+                               "unique-slug": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/unique-slug": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+                       "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "imurmurhash": "^0.1.4"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/unique-string": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
+                       "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "crypto-random-string": "^4.0.0"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/untildify": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+                       "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/update-browserslist-db": {
+                       "version": "1.0.13",
+                       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+                       "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+                       "dev": true,
+                       "funding": [
+                               {
+                                       "type": "opencollective",
+                                       "url": "https://opencollective.com/browserslist"
+                               },
+                               {
+                                       "type": "tidelift",
+                                       "url": "https://tidelift.com/funding/github/npm/browserslist"
+                               },
+                               {
+                                       "type": "github",
+                                       "url": "https://github.com/sponsors/ai"
+                               }
+                       ],
+                       "dependencies": {
+                               "escalade": "^3.1.1",
+                               "picocolors": "^1.0.0"
+                       },
+                       "bin": {
+                               "update-browserslist-db": "cli.js"
+                       },
+                       "peerDependencies": {
+                               "browserslist": ">= 4.21.0"
+                       }
+               },
+               "node_modules/update-notifier": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz",
+                       "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==",
+                       "dev": true,
+                       "dependencies": {
+                               "boxen": "^7.0.0",
+                               "chalk": "^5.0.1",
+                               "configstore": "^6.0.0",
+                               "has-yarn": "^3.0.0",
+                               "import-lazy": "^4.0.0",
+                               "is-ci": "^3.0.1",
+                               "is-installed-globally": "^0.4.0",
+                               "is-npm": "^6.0.0",
+                               "is-yarn-global": "^0.4.0",
+                               "latest-version": "^7.0.0",
+                               "pupa": "^3.1.0",
+                               "semver": "^7.3.7",
+                               "semver-diff": "^4.0.0",
+                               "xdg-basedir": "^5.1.0"
+                       },
+                       "engines": {
+                               "node": ">=14.16"
+                       },
+                       "funding": {
+                               "url": "https://github.com/yeoman/update-notifier?sponsor=1"
+                       }
+               },
+               "node_modules/update-notifier/node_modules/chalk": {
+                       "version": "5.3.0",
+                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+                       "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+                       "dev": true,
+                       "engines": {
+                               "node": "^12.17.0 || ^14.13 || >=16.0.0"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/chalk?sponsor=1"
+                       }
+               },
+               "node_modules/uri-js": {
+                       "version": "4.4.1",
+                       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+                       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+                       "dev": true,
+                       "dependencies": {
+                               "punycode": "^2.1.0"
+                       }
+               },
+               "node_modules/util-deprecate": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+                       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+                       "dev": true
+               },
+               "node_modules/utila": {
+                       "version": "0.4.0",
+                       "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+                       "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+                       "dev": true
+               },
+               "node_modules/validate-npm-package-license": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+                       "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+                       "dev": true,
+                       "dependencies": {
+                               "spdx-correct": "^3.0.0",
+                               "spdx-expression-parse": "^3.0.0"
+                       }
+               },
+               "node_modules/validate-npm-package-name": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz",
+                       "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "builtins": "^5.0.0"
+                       },
+                       "engines": {
+                               "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+                       }
+               },
+               "node_modules/watchpack": {
+                       "version": "2.4.0",
+                       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+                       "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+                       "dev": true,
+                       "dependencies": {
+                               "glob-to-regexp": "^0.4.1",
+                               "graceful-fs": "^4.1.2"
+                       },
+                       "engines": {
+                               "node": ">=10.13.0"
+                       }
+               },
+               "node_modules/web-worker": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
+                       "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
+               },
+               "node_modules/webpack": {
+                       "version": "5.89.0",
+                       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
+                       "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/eslint-scope": "^3.7.3",
+                               "@types/estree": "^1.0.0",
+                               "@webassemblyjs/ast": "^1.11.5",
+                               "@webassemblyjs/wasm-edit": "^1.11.5",
+                               "@webassemblyjs/wasm-parser": "^1.11.5",
+                               "acorn": "^8.7.1",
+                               "acorn-import-assertions": "^1.9.0",
+                               "browserslist": "^4.14.5",
+                               "chrome-trace-event": "^1.0.2",
+                               "enhanced-resolve": "^5.15.0",
+                               "es-module-lexer": "^1.2.1",
+                               "eslint-scope": "5.1.1",
+                               "events": "^3.2.0",
+                               "glob-to-regexp": "^0.4.1",
+                               "graceful-fs": "^4.2.9",
+                               "json-parse-even-better-errors": "^2.3.1",
+                               "loader-runner": "^4.2.0",
+                               "mime-types": "^2.1.27",
+                               "neo-async": "^2.6.2",
+                               "schema-utils": "^3.2.0",
+                               "tapable": "^2.1.1",
+                               "terser-webpack-plugin": "^5.3.7",
+                               "watchpack": "^2.4.0",
+                               "webpack-sources": "^3.2.3"
+                       },
+                       "bin": {
+                               "webpack": "bin/webpack.js"
+                       },
+                       "engines": {
+                               "node": ">=10.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       },
+                       "peerDependenciesMeta": {
+                               "webpack-cli": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/webpack-cli": {
+                       "version": "5.1.4",
+                       "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
+                       "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@discoveryjs/json-ext": "^0.5.0",
+                               "@webpack-cli/configtest": "^2.1.1",
+                               "@webpack-cli/info": "^2.0.2",
+                               "@webpack-cli/serve": "^2.0.5",
+                               "colorette": "^2.0.14",
+                               "commander": "^10.0.1",
+                               "cross-spawn": "^7.0.3",
+                               "envinfo": "^7.7.3",
+                               "fastest-levenshtein": "^1.0.12",
+                               "import-local": "^3.0.2",
+                               "interpret": "^3.1.1",
+                               "rechoir": "^0.8.0",
+                               "webpack-merge": "^5.7.3"
+                       },
+                       "bin": {
+                               "webpack-cli": "bin/cli.js"
+                       },
+                       "engines": {
+                               "node": ">=14.15.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       },
+                       "peerDependencies": {
+                               "webpack": "5.x.x"
+                       },
+                       "peerDependenciesMeta": {
+                               "@webpack-cli/generators": {
+                                       "optional": true
+                               },
+                               "webpack-bundle-analyzer": {
+                                       "optional": true
+                               },
+                               "webpack-dev-server": {
+                                       "optional": true
+                               }
+                       }
+               },
+               "node_modules/webpack-cli/node_modules/commander": {
+                       "version": "10.0.1",
+                       "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+                       "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=14"
+                       }
+               },
+               "node_modules/webpack-merge": {
+                       "version": "5.10.0",
+                       "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+                       "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+                       "dev": true,
+                       "dependencies": {
+                               "clone-deep": "^4.0.1",
+                               "flat": "^5.0.2",
+                               "wildcard": "^2.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10.0.0"
+                       }
+               },
+               "node_modules/webpack-sources": {
+                       "version": "3.2.3",
+                       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+                       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10.13.0"
+                       }
+               },
+               "node_modules/webpack/node_modules/ajv": {
+                       "version": "6.12.6",
+                       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+                       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+                       "dev": true,
+                       "dependencies": {
+                               "fast-deep-equal": "^3.1.1",
+                               "fast-json-stable-stringify": "^2.0.0",
+                               "json-schema-traverse": "^0.4.1",
+                               "uri-js": "^4.2.2"
+                       },
+                       "funding": {
+                               "type": "github",
+                               "url": "https://github.com/sponsors/epoberezkin"
+                       }
+               },
+               "node_modules/webpack/node_modules/ajv-keywords": {
+                       "version": "3.5.2",
+                       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+                       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+                       "dev": true,
+                       "peerDependencies": {
+                               "ajv": "^6.9.1"
+                       }
+               },
+               "node_modules/webpack/node_modules/json-parse-even-better-errors": {
+                       "version": "2.3.1",
+                       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+                       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+                       "dev": true
+               },
+               "node_modules/webpack/node_modules/json-schema-traverse": {
+                       "version": "0.4.1",
+                       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+                       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+                       "dev": true
+               },
+               "node_modules/webpack/node_modules/schema-utils": {
+                       "version": "3.3.0",
+                       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+                       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+                       "dev": true,
+                       "dependencies": {
+                               "@types/json-schema": "^7.0.8",
+                               "ajv": "^6.12.5",
+                               "ajv-keywords": "^3.5.2"
+                       },
+                       "engines": {
+                               "node": ">= 10.13.0"
+                       },
+                       "funding": {
+                               "type": "opencollective",
+                               "url": "https://opencollective.com/webpack"
+                       }
+               },
+               "node_modules/which": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+                       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+                       "dev": true,
+                       "dependencies": {
+                               "isexe": "^2.0.0"
+                       },
+                       "bin": {
+                               "node-which": "bin/node-which"
+                       },
+                       "engines": {
+                               "node": ">= 8"
+                       }
+               },
+               "node_modules/wide-align": {
+                       "version": "1.1.5",
+                       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+                       "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+                       "dev": true,
+                       "dependencies": {
+                               "string-width": "^1.0.2 || 2 || 3 || 4"
+                       }
+               },
+               "node_modules/widest-line": {
+                       "version": "4.0.1",
+                       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+                       "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+                       "dev": true,
+                       "dependencies": {
+                               "string-width": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/widest-line/node_modules/emoji-regex": {
+                       "version": "9.2.2",
+                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                       "dev": true
+               },
+               "node_modules/widest-line/node_modules/string-width": {
+                       "version": "5.1.2",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                       "dev": true,
+                       "dependencies": {
+                               "eastasianwidth": "^0.2.0",
+                               "emoji-regex": "^9.2.2",
+                               "strip-ansi": "^7.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/wildcard": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+                       "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+                       "dev": true
+               },
+               "node_modules/wrap-ansi": {
+                       "version": "8.1.0",
+                       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+                       "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-styles": "^6.1.0",
+                               "string-width": "^5.0.1",
+                               "strip-ansi": "^7.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+                       }
+               },
+               "node_modules/wrap-ansi-cjs": {
+                       "name": "wrap-ansi",
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+                       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-styles": "^4.0.0",
+                               "string-width": "^4.1.0",
+                               "strip-ansi": "^6.0.0"
+                       },
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+                       }
+               },
+               "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "dependencies": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "engines": {
+                               "node": ">=8"
+                       }
+               },
+               "node_modules/wrap-ansi/node_modules/ansi-styles": {
+                       "version": "6.2.1",
+                       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+                       "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+                       }
+               },
+               "node_modules/wrap-ansi/node_modules/emoji-regex": {
+                       "version": "9.2.2",
+                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                       "dev": true
+               },
+               "node_modules/wrap-ansi/node_modules/string-width": {
+                       "version": "5.1.2",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                       "dev": true,
+                       "dependencies": {
+                               "eastasianwidth": "^0.2.0",
+                               "emoji-regex": "^9.2.2",
+                               "strip-ansi": "^7.0.1"
+                       },
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/wrappy": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+                       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+                       "dev": true
+               },
+               "node_modules/write-file-atomic": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+                       "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+                       "dev": true,
+                       "dependencies": {
+                               "imurmurhash": "^0.1.4",
+                               "is-typedarray": "^1.0.0",
+                               "signal-exit": "^3.0.2",
+                               "typedarray-to-buffer": "^3.1.5"
+                       }
+               },
+               "node_modules/write-file-atomic/node_modules/signal-exit": {
+                       "version": "3.0.7",
+                       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+                       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+                       "dev": true
+               },
+               "node_modules/xdg-basedir": {
+                       "version": "5.1.0",
+                       "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
+                       "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=12"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/xml-utils": {
+                       "version": "1.7.0",
+                       "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.7.0.tgz",
+                       "integrity": "sha512-bWB489+RQQclC7A9OW8e5BzbT8Tu//jtAOvkYwewFr+Q9T9KDGvfzC1lp0pYPEQPEoPQLDkmxkepSC/2gIAZGw=="
+               },
+               "node_modules/xmlcreate": {
+                       "version": "2.0.4",
+                       "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
+                       "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
+                       "dev": true
+               },
+               "node_modules/yallist": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                       "dev": true
+               },
+               "node_modules/yocto-queue": {
+                       "version": "0.1.0",
+                       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+                       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+                       "dev": true,
+                       "engines": {
+                               "node": ">=10"
+                       },
+                       "funding": {
+                               "url": "https://github.com/sponsors/sindresorhus"
+                       }
+               },
+               "node_modules/zstddec": {
+                       "version": "0.1.0",
+                       "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz",
+                       "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg=="
+               }
+       },
+       "dependencies": {
+               "@babel/parser": {
+                       "version": "7.23.6",
+                       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+                       "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+                       "dev": true
+               },
+               "@colors/colors": {
+                       "version": "1.5.0",
+                       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+                       "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@discoveryjs/json-ext": {
+                       "version": "0.5.7",
+                       "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+                       "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+                       "dev": true
+               },
+               "@gar/promisify": {
+                       "version": "1.1.3",
+                       "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+                       "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
+                       "dev": true
+               },
+               "@isaacs/cliui": {
+                       "version": "8.0.2",
+                       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+                       "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+                       "dev": true,
+                       "requires": {
+                               "string-width": "^5.1.2",
+                               "string-width-cjs": "npm:string-width@^4.2.0",
+                               "strip-ansi": "^7.0.1",
+                               "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+                               "wrap-ansi": "^8.1.0",
+                               "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+                       },
+                       "dependencies": {
+                               "emoji-regex": {
+                                       "version": "9.2.2",
+                                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                                       "dev": true
+                               },
+                               "string-width": {
+                                       "version": "5.1.2",
+                                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "eastasianwidth": "^0.2.0",
+                                               "emoji-regex": "^9.2.2",
+                                               "strip-ansi": "^7.0.1"
+                                       }
+                               }
+                       }
+               },
+               "@jest/schemas": {
+                       "version": "29.6.3",
+                       "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+                       "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+                       "dev": true,
+                       "requires": {
+                               "@sinclair/typebox": "^0.27.8"
+                       }
+               },
+               "@jest/types": {
+                       "version": "29.6.3",
+                       "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+                       "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+                       "dev": true,
+                       "requires": {
+                               "@jest/schemas": "^29.6.3",
+                               "@types/istanbul-lib-coverage": "^2.0.0",
+                               "@types/istanbul-reports": "^3.0.0",
+                               "@types/node": "*",
+                               "@types/yargs": "^17.0.8",
+                               "chalk": "^4.0.0"
+                       }
+               },
+               "@jridgewell/gen-mapping": {
+                       "version": "0.3.3",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+                       "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+                       "dev": true,
+                       "requires": {
+                               "@jridgewell/set-array": "^1.0.1",
+                               "@jridgewell/sourcemap-codec": "^1.4.10",
+                               "@jridgewell/trace-mapping": "^0.3.9"
+                       }
+               },
+               "@jridgewell/resolve-uri": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+                       "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+                       "dev": true
+               },
+               "@jridgewell/set-array": {
+                       "version": "1.1.2",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+                       "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+                       "dev": true
+               },
+               "@jridgewell/source-map": {
+                       "version": "0.3.5",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+                       "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+                       "dev": true,
+                       "requires": {
+                               "@jridgewell/gen-mapping": "^0.3.0",
+                               "@jridgewell/trace-mapping": "^0.3.9"
+                       }
+               },
+               "@jridgewell/sourcemap-codec": {
+                       "version": "1.4.15",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+                       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+                       "dev": true
+               },
+               "@jridgewell/trace-mapping": {
+                       "version": "0.3.20",
+                       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+                       "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+                       "dev": true,
+                       "requires": {
+                               "@jridgewell/resolve-uri": "^3.1.0",
+                               "@jridgewell/sourcemap-codec": "^1.4.14"
+                       }
+               },
+               "@jsdoc/salty": {
+                       "version": "0.2.7",
+                       "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.7.tgz",
+                       "integrity": "sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==",
+                       "dev": true,
+                       "requires": {
+                               "lodash": "^4.17.21"
+                       }
+               },
+               "@kurkle/color": {
+                       "version": "0.3.2",
+                       "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
+                       "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
+               },
+               "@nieuwlandgeo/sldreader": {
+                       "version": "0.3.1",
+                       "resolved": "https://registry.npmjs.org/@nieuwlandgeo/sldreader/-/sldreader-0.3.1.tgz",
+                       "integrity": "sha512-gP1dw7ftVT34L6nv8dDtERNIJYENwe2I37Vwdm3NQH+KKHDk7vwrTANxvgKgbNybMXHF29jvI97Z/bkZYBqdxQ==",
+                       "requires": {}
+               },
+               "@nodelib/fs.scandir": {
+                       "version": "2.1.5",
+                       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+                       "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+                       "dev": true,
+                       "requires": {
+                               "@nodelib/fs.stat": "2.0.5",
+                               "run-parallel": "^1.1.9"
+                       }
+               },
+               "@nodelib/fs.stat": {
+                       "version": "2.0.5",
+                       "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+                       "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+                       "dev": true
+               },
+               "@nodelib/fs.walk": {
+                       "version": "1.2.8",
+                       "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+                       "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+                       "dev": true,
+                       "requires": {
+                               "@nodelib/fs.scandir": "2.1.5",
+                               "fastq": "^1.6.0"
+                       }
+               },
+               "@npmcli/fs": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz",
+                       "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==",
+                       "dev": true,
+                       "requires": {
+                               "semver": "^7.3.5"
+                       }
+               },
+               "@npmcli/git": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz",
+                       "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==",
+                       "dev": true,
+                       "requires": {
+                               "@npmcli/promise-spawn": "^6.0.0",
+                               "lru-cache": "^7.4.4",
+                               "npm-pick-manifest": "^8.0.0",
+                               "proc-log": "^3.0.0",
+                               "promise-inflight": "^1.0.1",
+                               "promise-retry": "^2.0.1",
+                               "semver": "^7.3.5",
+                               "which": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "which": {
+                                       "version": "3.0.1",
+                                       "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+                                       "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "isexe": "^2.0.0"
+                                       }
+                               }
+                       }
+               },
+               "@npmcli/installed-package-contents": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz",
+                       "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==",
+                       "dev": true,
+                       "requires": {
+                               "npm-bundled": "^3.0.0",
+                               "npm-normalize-package-bin": "^3.0.0"
+                       }
+               },
+               "@npmcli/move-file": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
+                       "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==",
+                       "dev": true,
+                       "requires": {
+                               "mkdirp": "^1.0.4",
+                               "rimraf": "^3.0.2"
+                       },
+                       "dependencies": {
+                               "brace-expansion": {
+                                       "version": "1.1.11",
+                                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+                                       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "balanced-match": "^1.0.0",
+                                               "concat-map": "0.0.1"
+                                       }
+                               },
+                               "glob": {
+                                       "version": "7.2.3",
+                                       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+                                       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+                                       "dev": true,
+                                       "requires": {
+                                               "fs.realpath": "^1.0.0",
+                                               "inflight": "^1.0.4",
+                                               "inherits": "2",
+                                               "minimatch": "^3.1.1",
+                                               "once": "^1.3.0",
+                                               "path-is-absolute": "^1.0.0"
+                                       }
+                               },
+                               "minimatch": {
+                                       "version": "3.1.2",
+                                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+                                       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "brace-expansion": "^1.1.7"
+                                       }
+                               },
+                               "rimraf": {
+                                       "version": "3.0.2",
+                                       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+                                       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "glob": "^7.1.3"
+                                       }
+                               }
+                       }
+               },
+               "@npmcli/node-gyp": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz",
+                       "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==",
+                       "dev": true
+               },
+               "@npmcli/promise-spawn": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz",
+                       "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==",
+                       "dev": true,
+                       "requires": {
+                               "which": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "which": {
+                                       "version": "3.0.1",
+                                       "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+                                       "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "isexe": "^2.0.0"
+                                       }
+                               }
+                       }
+               },
+               "@npmcli/run-script": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz",
+                       "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==",
+                       "dev": true,
+                       "requires": {
+                               "@npmcli/node-gyp": "^3.0.0",
+                               "@npmcli/promise-spawn": "^6.0.0",
+                               "node-gyp": "^9.0.0",
+                               "read-package-json-fast": "^3.0.0",
+                               "which": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "which": {
+                                       "version": "3.0.1",
+                                       "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
+                                       "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "isexe": "^2.0.0"
+                                       }
+                               }
+                       }
+               },
+               "@petamoriken/float16": {
+                       "version": "3.8.4",
+                       "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.8.4.tgz",
+                       "integrity": "sha512-kB+NJ5Br56ZhElKsf0pM7/PQfrDdDVMRz8f0JM6eVOGE+L89z9hwcst9QvWBBnazzuqGTGtPsJNZoQ1JdNiGSQ=="
+               },
+               "@pkgjs/parseargs": {
+                       "version": "0.11.0",
+                       "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+                       "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+                       "dev": true,
+                       "optional": true
+               },
+               "@pnpm/config.env-replace": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
+                       "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
+                       "dev": true
+               },
+               "@pnpm/network.ca-file": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
+                       "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+                       "dev": true,
+                       "requires": {
+                               "graceful-fs": "4.2.10"
+                       },
+                       "dependencies": {
+                               "graceful-fs": {
+                                       "version": "4.2.10",
+                                       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+                                       "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "@pnpm/npm-conf": {
+                       "version": "2.2.2",
+                       "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz",
+                       "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==",
+                       "dev": true,
+                       "requires": {
+                               "@pnpm/config.env-replace": "^1.1.0",
+                               "@pnpm/network.ca-file": "^1.0.1",
+                               "config-chain": "^1.1.11"
+                       }
+               },
+               "@sigstore/bundle": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz",
+                       "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==",
+                       "dev": true,
+                       "requires": {
+                               "@sigstore/protobuf-specs": "^0.2.0"
+                       }
+               },
+               "@sigstore/protobuf-specs": {
+                       "version": "0.2.1",
+                       "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz",
+                       "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==",
+                       "dev": true
+               },
+               "@sigstore/sign": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz",
+                       "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==",
+                       "dev": true,
+                       "requires": {
+                               "@sigstore/bundle": "^1.1.0",
+                               "@sigstore/protobuf-specs": "^0.2.0",
+                               "make-fetch-happen": "^11.0.1"
+                       }
+               },
+               "@sigstore/tuf": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz",
+                       "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==",
+                       "dev": true,
+                       "requires": {
+                               "@sigstore/protobuf-specs": "^0.2.0",
+                               "tuf-js": "^1.1.7"
+                       }
+               },
+               "@sinclair/typebox": {
+                       "version": "0.27.8",
+                       "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+                       "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+                       "dev": true
+               },
+               "@sindresorhus/is": {
+                       "version": "5.6.0",
+                       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
+                       "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==",
+                       "dev": true
+               },
+               "@szmarczak/http-timer": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+                       "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+                       "dev": true,
+                       "requires": {
+                               "defer-to-connect": "^2.0.1"
+                       }
+               },
+               "@tootallnate/once": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+                       "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+                       "dev": true
+               },
+               "@trysound/sax": {
+                       "version": "0.2.0",
+                       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+                       "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+                       "dev": true
+               },
+               "@tufjs/canonical-json": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz",
+                       "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==",
+                       "dev": true
+               },
+               "@tufjs/models": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz",
+                       "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==",
+                       "dev": true,
+                       "requires": {
+                               "@tufjs/canonical-json": "1.0.0",
+                               "minimatch": "^9.0.0"
+                       }
+               },
+               "@types/eslint": {
+                       "version": "8.44.9",
+                       "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.9.tgz",
+                       "integrity": "sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==",
+                       "dev": true,
+                       "requires": {
+                               "@types/estree": "*",
+                               "@types/json-schema": "*"
+                       }
+               },
+               "@types/eslint-scope": {
+                       "version": "3.7.7",
+                       "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+                       "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+                       "dev": true,
+                       "requires": {
+                               "@types/eslint": "*",
+                               "@types/estree": "*"
+                       }
+               },
+               "@types/estree": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+                       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+                       "dev": true
+               },
+               "@types/html-minifier-terser": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+                       "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+                       "dev": true
+               },
+               "@types/http-cache-semantics": {
+                       "version": "4.0.4",
+                       "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
+                       "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
+                       "dev": true
+               },
+               "@types/istanbul-lib-coverage": {
+                       "version": "2.0.6",
+                       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+                       "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+                       "dev": true
+               },
+               "@types/istanbul-lib-report": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+                       "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+                       "dev": true,
+                       "requires": {
+                               "@types/istanbul-lib-coverage": "*"
+                       }
+               },
+               "@types/istanbul-reports": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+                       "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+                       "dev": true,
+                       "requires": {
+                               "@types/istanbul-lib-report": "*"
+                       }
+               },
+               "@types/json-schema": {
+                       "version": "7.0.15",
+                       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+                       "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+                       "dev": true
+               },
+               "@types/linkify-it": {
+                       "version": "3.0.5",
+                       "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz",
+                       "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==",
+                       "dev": true
+               },
+               "@types/markdown-it": {
+                       "version": "12.2.3",
+                       "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
+                       "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+                       "dev": true,
+                       "requires": {
+                               "@types/linkify-it": "*",
+                               "@types/mdurl": "*"
+                       }
+               },
+               "@types/mdurl": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz",
+                       "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==",
+                       "dev": true
+               },
+               "@types/node": {
+                       "version": "20.10.4",
+                       "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz",
+                       "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==",
+                       "dev": true,
+                       "requires": {
+                               "undici-types": "~5.26.4"
+                       }
+               },
+               "@types/yargs": {
+                       "version": "17.0.32",
+                       "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
+                       "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
+                       "dev": true,
+                       "requires": {
+                               "@types/yargs-parser": "*"
+                       }
+               },
+               "@types/yargs-parser": {
+                       "version": "21.0.3",
+                       "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+                       "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+                       "dev": true
+               },
+               "@webassemblyjs/ast": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+                       "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/helper-numbers": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+                       }
+               },
+               "@webassemblyjs/floating-point-hex-parser": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+                       "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+                       "dev": true
+               },
+               "@webassemblyjs/helper-api-error": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+                       "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+                       "dev": true
+               },
+               "@webassemblyjs/helper-buffer": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+                       "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+                       "dev": true
+               },
+               "@webassemblyjs/helper-numbers": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+                       "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+                               "@webassemblyjs/helper-api-error": "1.11.6",
+                               "@xtuc/long": "4.2.2"
+                       }
+               },
+               "@webassemblyjs/helper-wasm-bytecode": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+                       "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+                       "dev": true
+               },
+               "@webassemblyjs/helper-wasm-section": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+                       "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-buffer": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/wasm-gen": "1.11.6"
+                       }
+               },
+               "@webassemblyjs/ieee754": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+                       "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+                       "dev": true,
+                       "requires": {
+                               "@xtuc/ieee754": "^1.2.0"
+                       }
+               },
+               "@webassemblyjs/leb128": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+                       "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+                       "dev": true,
+                       "requires": {
+                               "@xtuc/long": "4.2.2"
+                       }
+               },
+               "@webassemblyjs/utf8": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+                       "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+                       "dev": true
+               },
+               "@webassemblyjs/wasm-edit": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+                       "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-buffer": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/helper-wasm-section": "1.11.6",
+                               "@webassemblyjs/wasm-gen": "1.11.6",
+                               "@webassemblyjs/wasm-opt": "1.11.6",
+                               "@webassemblyjs/wasm-parser": "1.11.6",
+                               "@webassemblyjs/wast-printer": "1.11.6"
+                       }
+               },
+               "@webassemblyjs/wasm-gen": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+                       "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/ieee754": "1.11.6",
+                               "@webassemblyjs/leb128": "1.11.6",
+                               "@webassemblyjs/utf8": "1.11.6"
+                       }
+               },
+               "@webassemblyjs/wasm-opt": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+                       "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-buffer": "1.11.6",
+                               "@webassemblyjs/wasm-gen": "1.11.6",
+                               "@webassemblyjs/wasm-parser": "1.11.6"
+                       }
+               },
+               "@webassemblyjs/wasm-parser": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+                       "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@webassemblyjs/helper-api-error": "1.11.6",
+                               "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+                               "@webassemblyjs/ieee754": "1.11.6",
+                               "@webassemblyjs/leb128": "1.11.6",
+                               "@webassemblyjs/utf8": "1.11.6"
+                       }
+               },
+               "@webassemblyjs/wast-printer": {
+                       "version": "1.11.6",
+                       "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+                       "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+                       "dev": true,
+                       "requires": {
+                               "@webassemblyjs/ast": "1.11.6",
+                               "@xtuc/long": "4.2.2"
+                       }
+               },
+               "@webpack-cli/configtest": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+                       "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "@webpack-cli/info": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+                       "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "@webpack-cli/serve": {
+                       "version": "2.0.5",
+                       "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+                       "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "@xtuc/ieee754": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+                       "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+                       "dev": true
+               },
+               "@xtuc/long": {
+                       "version": "4.2.2",
+                       "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+                       "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+                       "dev": true
+               },
+               "abbrev": {
+                       "version": "1.1.1",
+                       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+                       "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+                       "dev": true
+               },
+               "acorn": {
+                       "version": "8.11.2",
+                       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
+                       "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+                       "dev": true
+               },
+               "acorn-import-assertions": {
+                       "version": "1.9.0",
+                       "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+                       "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "agent-base": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+                       "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+                       "dev": true,
+                       "requires": {
+                               "debug": "4"
+                       }
+               },
+               "agentkeepalive": {
+                       "version": "4.5.0",
+                       "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
+                       "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
+                       "dev": true,
+                       "requires": {
+                               "humanize-ms": "^1.2.1"
+                       }
+               },
+               "aggregate-error": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+                       "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+                       "dev": true,
+                       "requires": {
+                               "clean-stack": "^2.0.0",
+                               "indent-string": "^4.0.0"
+                       }
+               },
+               "ajv": {
+                       "version": "8.12.0",
+                       "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+                       "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+                       "dev": true,
+                       "requires": {
+                               "fast-deep-equal": "^3.1.1",
+                               "json-schema-traverse": "^1.0.0",
+                               "require-from-string": "^2.0.2",
+                               "uri-js": "^4.2.2"
+                       }
+               },
+               "ajv-formats": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+                       "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+                       "dev": true,
+                       "requires": {
+                               "ajv": "^8.0.0"
+                       }
+               },
+               "ajv-keywords": {
+                       "version": "5.1.0",
+                       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+                       "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+                       "dev": true,
+                       "requires": {
+                               "fast-deep-equal": "^3.1.3"
+                       }
+               },
+               "ansi-align": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
+                       "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
+                       "dev": true,
+                       "requires": {
+                               "string-width": "^4.1.0"
+                       }
+               },
+               "ansi-regex": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+                       "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+                       "dev": true
+               },
+               "ansi-styles": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+                       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+                       "dev": true,
+                       "requires": {
+                               "color-convert": "^2.0.1"
+                       }
+               },
+               "aproba": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+                       "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+                       "dev": true
+               },
+               "are-we-there-yet": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+                       "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+                       "dev": true,
+                       "requires": {
+                               "delegates": "^1.0.0",
+                               "readable-stream": "^3.6.0"
+                       }
+               },
+               "argparse": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+                       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+                       "dev": true
+               },
+               "array-union": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+                       "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+                       "dev": true
+               },
+               "balanced-match": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+                       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+                       "dev": true
+               },
+               "bluebird": {
+                       "version": "3.7.2",
+                       "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+                       "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+                       "dev": true
+               },
+               "boolbase": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+                       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+                       "dev": true
+               },
+               "boxen": {
+                       "version": "7.1.1",
+                       "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz",
+                       "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==",
+                       "dev": true,
+                       "requires": {
+                               "ansi-align": "^3.0.1",
+                               "camelcase": "^7.0.1",
+                               "chalk": "^5.2.0",
+                               "cli-boxes": "^3.0.0",
+                               "string-width": "^5.1.2",
+                               "type-fest": "^2.13.0",
+                               "widest-line": "^4.0.1",
+                               "wrap-ansi": "^8.1.0"
+                       },
+                       "dependencies": {
+                               "chalk": {
+                                       "version": "5.3.0",
+                                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+                                       "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+                                       "dev": true
+                               },
+                               "emoji-regex": {
+                                       "version": "9.2.2",
+                                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                                       "dev": true
+                               },
+                               "string-width": {
+                                       "version": "5.1.2",
+                                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "eastasianwidth": "^0.2.0",
+                                               "emoji-regex": "^9.2.2",
+                                               "strip-ansi": "^7.0.1"
+                                       }
+                               }
+                       }
+               },
+               "brace-expansion": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+                       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+                       "dev": true,
+                       "requires": {
+                               "balanced-match": "^1.0.0"
+                       }
+               },
+               "braces": {
+                       "version": "3.0.2",
+                       "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+                       "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+                       "dev": true,
+                       "requires": {
+                               "fill-range": "^7.0.1"
+                       }
+               },
+               "browserslist": {
+                       "version": "4.22.2",
+                       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+                       "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+                       "dev": true,
+                       "requires": {
+                               "caniuse-lite": "^1.0.30001565",
+                               "electron-to-chromium": "^1.4.601",
+                               "node-releases": "^2.0.14",
+                               "update-browserslist-db": "^1.0.13"
+                       }
+               },
+               "buffer-from": {
+                       "version": "1.1.2",
+                       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+                       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+                       "dev": true
+               },
+               "builtins": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
+                       "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+                       "dev": true,
+                       "requires": {
+                               "semver": "^7.0.0"
+                       }
+               },
+               "cacache": {
+                       "version": "17.1.4",
+                       "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz",
+                       "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==",
+                       "dev": true,
+                       "requires": {
+                               "@npmcli/fs": "^3.1.0",
+                               "fs-minipass": "^3.0.0",
+                               "glob": "^10.2.2",
+                               "lru-cache": "^7.7.1",
+                               "minipass": "^7.0.3",
+                               "minipass-collect": "^1.0.2",
+                               "minipass-flush": "^1.0.5",
+                               "minipass-pipeline": "^1.2.4",
+                               "p-map": "^4.0.0",
+                               "ssri": "^10.0.0",
+                               "tar": "^6.1.11",
+                               "unique-filename": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "7.0.4",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "cacheable-lookup": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
+                       "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+                       "dev": true
+               },
+               "cacheable-request": {
+                       "version": "10.2.14",
+                       "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz",
+                       "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==",
+                       "dev": true,
+                       "requires": {
+                               "@types/http-cache-semantics": "^4.0.2",
+                               "get-stream": "^6.0.1",
+                               "http-cache-semantics": "^4.1.1",
+                               "keyv": "^4.5.3",
+                               "mimic-response": "^4.0.0",
+                               "normalize-url": "^8.0.0",
+                               "responselike": "^3.0.0"
+                       }
+               },
+               "camel-case": {
+                       "version": "4.1.2",
+                       "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+                       "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+                       "dev": true,
+                       "requires": {
+                               "pascal-case": "^3.1.2",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "camelcase": {
+                       "version": "7.0.1",
+                       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
+                       "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
+                       "dev": true
+               },
+               "caniuse-api": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+                       "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.0.0",
+                               "caniuse-lite": "^1.0.0",
+                               "lodash.memoize": "^4.1.2",
+                               "lodash.uniq": "^4.5.0"
+                       }
+               },
+               "caniuse-lite": {
+                       "version": "1.0.30001570",
+                       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
+                       "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+                       "dev": true
+               },
+               "catharsis": {
+                       "version": "0.9.0",
+                       "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz",
+                       "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==",
+                       "dev": true,
+                       "requires": {
+                               "lodash": "^4.17.15"
+                       }
+               },
+               "chalk": {
+                       "version": "4.1.2",
+                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+                       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+                       "dev": true,
+                       "requires": {
+                               "ansi-styles": "^4.1.0",
+                               "supports-color": "^7.1.0"
+                       },
+                       "dependencies": {
+                               "supports-color": {
+                                       "version": "7.2.0",
+                                       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+                                       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "has-flag": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "chart.js": {
+                       "version": "4.4.1",
+                       "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz",
+                       "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==",
+                       "requires": {
+                               "@kurkle/color": "^0.3.0"
+                       }
+               },
+               "chartjs-plugin-annotation": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-3.0.1.tgz",
+                       "integrity": "sha512-hlIrXXKqSDgb+ZjVYHefmlZUXK8KbkCPiynSVrTb/HjTMkT62cOInaT1NTQCKtxKKOm9oHp958DY3RTAFKtkHg==",
+                       "requires": {}
+               },
+               "chownr": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+                       "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+                       "dev": true
+               },
+               "chrome-trace-event": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+                       "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+                       "dev": true
+               },
+               "ci-info": {
+                       "version": "3.9.0",
+                       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+                       "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+                       "dev": true
+               },
+               "clean-css": {
+                       "version": "5.3.3",
+                       "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
+                       "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+                       "dev": true,
+                       "requires": {
+                               "source-map": "~0.6.0"
+                       }
+               },
+               "clean-stack": {
+                       "version": "2.2.0",
+                       "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+                       "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+                       "dev": true
+               },
+               "cli-boxes": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
+                       "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+                       "dev": true
+               },
+               "cli-table3": {
+                       "version": "0.6.3",
+                       "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+                       "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+                       "dev": true,
+                       "requires": {
+                               "@colors/colors": "1.5.0",
+                               "string-width": "^4.2.0"
+                       }
+               },
+               "clone-deep": {
+                       "version": "4.0.1",
+                       "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+                       "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+                       "dev": true,
+                       "requires": {
+                               "is-plain-object": "^2.0.4",
+                               "kind-of": "^6.0.2",
+                               "shallow-clone": "^3.0.0"
+                       }
+               },
+               "color-convert": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+                       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+                       "dev": true,
+                       "requires": {
+                               "color-name": "~1.1.4"
+                       }
+               },
+               "color-name": {
+                       "version": "1.1.4",
+                       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+                       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+               },
+               "color-parse": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz",
+                       "integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==",
+                       "requires": {
+                               "color-name": "^1.0.0"
+                       }
+               },
+               "color-rgba": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz",
+                       "integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==",
+                       "requires": {
+                               "color-parse": "^2.0.0",
+                               "color-space": "^2.0.0"
+                       }
+               },
+               "color-space": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/color-space/-/color-space-2.0.1.tgz",
+                       "integrity": "sha512-nKqUYlo0vZATVOFHY810BSYjmCARrG7e5R3UE3CQlyjJTvv5kSSmPG1kzm/oDyyqjehM+lW1RnEt9It9GNa5JA=="
+               },
+               "color-support": {
+                       "version": "1.1.3",
+                       "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+                       "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+                       "dev": true
+               },
+               "colord": {
+                       "version": "2.9.3",
+                       "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+                       "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+                       "dev": true
+               },
+               "colorette": {
+                       "version": "2.0.20",
+                       "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+                       "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+                       "dev": true
+               },
+               "commander": {
+                       "version": "8.3.0",
+                       "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+                       "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+                       "dev": true
+               },
+               "concat-map": {
+                       "version": "0.0.1",
+                       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+                       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+                       "dev": true
+               },
+               "config-chain": {
+                       "version": "1.1.13",
+                       "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+                       "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+                       "dev": true,
+                       "requires": {
+                               "ini": "^1.3.4",
+                               "proto-list": "~1.2.1"
+                       },
+                       "dependencies": {
+                               "ini": {
+                                       "version": "1.3.8",
+                                       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+                                       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "configstore": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
+                       "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
+                       "dev": true,
+                       "requires": {
+                               "dot-prop": "^6.0.1",
+                               "graceful-fs": "^4.2.6",
+                               "unique-string": "^3.0.0",
+                               "write-file-atomic": "^3.0.3",
+                               "xdg-basedir": "^5.0.1"
+                       }
+               },
+               "console-control-strings": {
+                       "version": "1.1.0",
+                       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+                       "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+                       "dev": true
+               },
+               "cross-spawn": {
+                       "version": "7.0.3",
+                       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+                       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+                       "dev": true,
+                       "requires": {
+                               "path-key": "^3.1.0",
+                               "shebang-command": "^2.0.0",
+                               "which": "^2.0.1"
+                       }
+               },
+               "crypto-random-string": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
+                       "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
+                       "dev": true,
+                       "requires": {
+                               "type-fest": "^1.0.1"
+                       },
+                       "dependencies": {
+                               "type-fest": {
+                                       "version": "1.4.0",
+                                       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
+                                       "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "css-declaration-sorter": {
+                       "version": "6.4.1",
+                       "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz",
+                       "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "css-loader": {
+                       "version": "6.8.1",
+                       "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz",
+                       "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==",
+                       "dev": true,
+                       "requires": {
+                               "icss-utils": "^5.1.0",
+                               "postcss": "^8.4.21",
+                               "postcss-modules-extract-imports": "^3.0.0",
+                               "postcss-modules-local-by-default": "^4.0.3",
+                               "postcss-modules-scope": "^3.0.0",
+                               "postcss-modules-values": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0",
+                               "semver": "^7.3.8"
+                       }
+               },
+               "css-minimizer-webpack-plugin": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz",
+                       "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==",
+                       "dev": true,
+                       "requires": {
+                               "@jridgewell/trace-mapping": "^0.3.18",
+                               "cssnano": "^6.0.1",
+                               "jest-worker": "^29.4.3",
+                               "postcss": "^8.4.24",
+                               "schema-utils": "^4.0.1",
+                               "serialize-javascript": "^6.0.1"
+                       }
+               },
+               "css-select": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
+                       "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+                       "dev": true,
+                       "requires": {
+                               "boolbase": "^1.0.0",
+                               "css-what": "^6.0.1",
+                               "domhandler": "^4.3.1",
+                               "domutils": "^2.8.0",
+                               "nth-check": "^2.0.1"
+                       }
+               },
+               "css-tree": {
+                       "version": "2.3.1",
+                       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+                       "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+                       "dev": true,
+                       "requires": {
+                               "mdn-data": "2.0.30",
+                               "source-map-js": "^1.0.1"
+                       }
+               },
+               "css-what": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+                       "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+                       "dev": true
+               },
+               "cssesc": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+                       "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+                       "dev": true
+               },
+               "cssnano": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz",
+                       "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==",
+                       "dev": true,
+                       "requires": {
+                               "cssnano-preset-default": "^6.0.1",
+                               "lilconfig": "^2.1.0"
+                       }
+               },
+               "cssnano-preset-default": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz",
+                       "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==",
+                       "dev": true,
+                       "requires": {
+                               "css-declaration-sorter": "^6.3.1",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-calc": "^9.0.0",
+                               "postcss-colormin": "^6.0.0",
+                               "postcss-convert-values": "^6.0.0",
+                               "postcss-discard-comments": "^6.0.0",
+                               "postcss-discard-duplicates": "^6.0.0",
+                               "postcss-discard-empty": "^6.0.0",
+                               "postcss-discard-overridden": "^6.0.0",
+                               "postcss-merge-longhand": "^6.0.0",
+                               "postcss-merge-rules": "^6.0.1",
+                               "postcss-minify-font-values": "^6.0.0",
+                               "postcss-minify-gradients": "^6.0.0",
+                               "postcss-minify-params": "^6.0.0",
+                               "postcss-minify-selectors": "^6.0.0",
+                               "postcss-normalize-charset": "^6.0.0",
+                               "postcss-normalize-display-values": "^6.0.0",
+                               "postcss-normalize-positions": "^6.0.0",
+                               "postcss-normalize-repeat-style": "^6.0.0",
+                               "postcss-normalize-string": "^6.0.0",
+                               "postcss-normalize-timing-functions": "^6.0.0",
+                               "postcss-normalize-unicode": "^6.0.0",
+                               "postcss-normalize-url": "^6.0.0",
+                               "postcss-normalize-whitespace": "^6.0.0",
+                               "postcss-ordered-values": "^6.0.0",
+                               "postcss-reduce-initial": "^6.0.0",
+                               "postcss-reduce-transforms": "^6.0.0",
+                               "postcss-svgo": "^6.0.0",
+                               "postcss-unique-selectors": "^6.0.0"
+                       }
+               },
+               "cssnano-utils": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz",
+                       "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "csso": {
+                       "version": "5.0.5",
+                       "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+                       "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+                       "dev": true,
+                       "requires": {
+                               "css-tree": "~2.2.0"
+                       },
+                       "dependencies": {
+                               "css-tree": {
+                                       "version": "2.2.1",
+                                       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+                                       "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "mdn-data": "2.0.28",
+                                               "source-map-js": "^1.0.1"
+                                       }
+                               },
+                               "mdn-data": {
+                                       "version": "2.0.28",
+                                       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+                                       "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "debug": {
+                       "version": "4.3.4",
+                       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+                       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+                       "dev": true,
+                       "requires": {
+                               "ms": "2.1.2"
+                       }
+               },
+               "decompress-response": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+                       "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+                       "dev": true,
+                       "requires": {
+                               "mimic-response": "^3.1.0"
+                       },
+                       "dependencies": {
+                               "mimic-response": {
+                                       "version": "3.1.0",
+                                       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+                                       "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "deep-extend": {
+                       "version": "0.6.0",
+                       "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+                       "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+                       "dev": true
+               },
+               "defer-to-connect": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+                       "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+                       "dev": true
+               },
+               "delegates": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+                       "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+                       "dev": true
+               },
+               "dir-glob": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+                       "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+                       "dev": true,
+                       "requires": {
+                               "path-type": "^4.0.0"
+                       }
+               },
+               "dom-converter": {
+                       "version": "0.2.0",
+                       "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+                       "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+                       "dev": true,
+                       "requires": {
+                               "utila": "~0.4"
+                       }
+               },
+               "dom-serializer": {
+                       "version": "1.4.1",
+                       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
+                       "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+                       "dev": true,
+                       "requires": {
+                               "domelementtype": "^2.0.1",
+                               "domhandler": "^4.2.0",
+                               "entities": "^2.0.0"
+                       }
+               },
+               "domelementtype": {
+                       "version": "2.3.0",
+                       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+                       "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+                       "dev": true
+               },
+               "domhandler": {
+                       "version": "4.3.1",
+                       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
+                       "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+                       "dev": true,
+                       "requires": {
+                               "domelementtype": "^2.2.0"
+                       }
+               },
+               "domutils": {
+                       "version": "2.8.0",
+                       "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+                       "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+                       "dev": true,
+                       "requires": {
+                               "dom-serializer": "^1.0.1",
+                               "domelementtype": "^2.2.0",
+                               "domhandler": "^4.2.0"
+                       }
+               },
+               "dot-case": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+                       "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+                       "dev": true,
+                       "requires": {
+                               "no-case": "^3.0.4",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "dot-prop": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
+                       "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
+                       "dev": true,
+                       "requires": {
+                               "is-obj": "^2.0.0"
+                       }
+               },
+               "earcut": {
+                       "version": "2.2.4",
+                       "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
+                       "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ=="
+               },
+               "eastasianwidth": {
+                       "version": "0.2.0",
+                       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+                       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+                       "dev": true
+               },
+               "electron-to-chromium": {
+                       "version": "1.4.612",
+                       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.612.tgz",
+                       "integrity": "sha512-dM8BMtXtlH237ecSMnYdYuCkib2QHq0kpWfUnavjdYsyr/6OsAwg5ZGUfnQ9KD1Ga4QgB2sqXlB2NT8zy2GnVg==",
+                       "dev": true
+               },
+               "emoji-regex": {
+                       "version": "8.0.0",
+                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+                       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+                       "dev": true
+               },
+               "encoding": {
+                       "version": "0.1.13",
+                       "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+                       "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+                       "dev": true,
+                       "optional": true,
+                       "requires": {
+                               "iconv-lite": "^0.6.2"
+                       }
+               },
+               "enhanced-resolve": {
+                       "version": "5.15.0",
+                       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+                       "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+                       "dev": true,
+                       "requires": {
+                               "graceful-fs": "^4.2.4",
+                               "tapable": "^2.2.0"
+                       }
+               },
+               "entities": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+                       "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+                       "dev": true
+               },
+               "env-paths": {
+                       "version": "2.2.1",
+                       "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+                       "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+                       "dev": true
+               },
+               "envinfo": {
+                       "version": "7.11.0",
+                       "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
+                       "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
+                       "dev": true
+               },
+               "err-code": {
+                       "version": "2.0.3",
+                       "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+                       "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+                       "dev": true
+               },
+               "es-module-lexer": {
+                       "version": "1.4.1",
+                       "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+                       "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
+                       "dev": true
+               },
+               "escalade": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+                       "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+                       "dev": true
+               },
+               "escape-goat": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz",
+                       "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==",
+                       "dev": true
+               },
+               "escape-string-regexp": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+                       "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+                       "dev": true
+               },
+               "eslint-scope": {
+                       "version": "5.1.1",
+                       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+                       "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+                       "dev": true,
+                       "requires": {
+                               "esrecurse": "^4.3.0",
+                               "estraverse": "^4.1.1"
+                       }
+               },
+               "esrecurse": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+                       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+                       "dev": true,
+                       "requires": {
+                               "estraverse": "^5.2.0"
+                       },
+                       "dependencies": {
+                               "estraverse": {
+                                       "version": "5.3.0",
+                                       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+                                       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "estraverse": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+                       "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+                       "dev": true
+               },
+               "events": {
+                       "version": "3.3.0",
+                       "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+                       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+                       "dev": true
+               },
+               "exponential-backoff": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
+                       "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==",
+                       "dev": true
+               },
+               "fast-deep-equal": {
+                       "version": "3.1.3",
+                       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+                       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+                       "dev": true
+               },
+               "fast-glob": {
+                       "version": "3.3.2",
+                       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+                       "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+                       "dev": true,
+                       "requires": {
+                               "@nodelib/fs.stat": "^2.0.2",
+                               "@nodelib/fs.walk": "^1.2.3",
+                               "glob-parent": "^5.1.2",
+                               "merge2": "^1.3.0",
+                               "micromatch": "^4.0.4"
+                       }
+               },
+               "fast-json-stable-stringify": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+                       "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+                       "dev": true
+               },
+               "fast-memoize": {
+                       "version": "2.5.2",
+                       "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz",
+                       "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==",
+                       "dev": true
+               },
+               "fastest-levenshtein": {
+                       "version": "1.0.16",
+                       "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+                       "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+                       "dev": true
+               },
+               "fastq": {
+                       "version": "1.15.0",
+                       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+                       "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+                       "dev": true,
+                       "requires": {
+                               "reusify": "^1.0.4"
+                       }
+               },
+               "fill-range": {
+                       "version": "7.0.1",
+                       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+                       "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+                       "dev": true,
+                       "requires": {
+                               "to-regex-range": "^5.0.1"
+                       }
+               },
+               "find-up": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+                       "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+                       "dev": true,
+                       "requires": {
+                               "locate-path": "^6.0.0",
+                               "path-exists": "^4.0.0"
+                       }
+               },
+               "flat": {
+                       "version": "5.0.2",
+                       "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+                       "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+                       "dev": true
+               },
+               "foreground-child": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+                       "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+                       "dev": true,
+                       "requires": {
+                               "cross-spawn": "^7.0.0",
+                               "signal-exit": "^4.0.1"
+                       }
+               },
+               "form-data-encoder": {
+                       "version": "2.1.4",
+                       "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+                       "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
+                       "dev": true
+               },
+               "fp-and-or": {
+                       "version": "0.1.4",
+                       "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz",
+                       "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==",
+                       "dev": true
+               },
+               "fs-minipass": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+                       "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+                       "dev": true,
+                       "requires": {
+                               "minipass": "^7.0.3"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "7.0.4",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "fs.realpath": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+                       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+                       "dev": true
+               },
+               "function-bind": {
+                       "version": "1.1.2",
+                       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+                       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+                       "dev": true
+               },
+               "gauge": {
+                       "version": "4.0.4",
+                       "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+                       "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+                       "dev": true,
+                       "requires": {
+                               "aproba": "^1.0.3 || ^2.0.0",
+                               "color-support": "^1.1.3",
+                               "console-control-strings": "^1.1.0",
+                               "has-unicode": "^2.0.1",
+                               "signal-exit": "^3.0.7",
+                               "string-width": "^4.2.3",
+                               "strip-ansi": "^6.0.1",
+                               "wide-align": "^1.1.5"
+                       },
+                       "dependencies": {
+                               "ansi-regex": {
+                                       "version": "5.0.1",
+                                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                                       "dev": true
+                               },
+                               "signal-exit": {
+                                       "version": "3.0.7",
+                                       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+                                       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+                                       "dev": true
+                               },
+                               "strip-ansi": {
+                                       "version": "6.0.1",
+                                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                                       "dev": true,
+                                       "requires": {
+                                               "ansi-regex": "^5.0.1"
+                                       }
+                               }
+                       }
+               },
+               "geotiff": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.0.tgz",
+                       "integrity": "sha512-B/iFJuFfRpmPHXf8aIRPRgUWwfaNb6dlsynkM8SWeHAPu7CpyvfqEa43KlBt7xxq5OTVysQacFHxhCn3SZhRKQ==",
+                       "requires": {
+                               "@petamoriken/float16": "^3.4.7",
+                               "lerc": "^3.0.0",
+                               "pako": "^2.0.4",
+                               "parse-headers": "^2.0.2",
+                               "quick-lru": "^6.1.1",
+                               "web-worker": "^1.2.0",
+                               "xml-utils": "^1.0.2",
+                               "zstddec": "^0.1.0"
+                       }
+               },
+               "get-stdin": {
+                       "version": "8.0.0",
+                       "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+                       "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+                       "dev": true
+               },
+               "get-stream": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+                       "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+                       "dev": true
+               },
+               "glob": {
+                       "version": "10.3.10",
+                       "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
+                       "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
+                       "dev": true,
+                       "requires": {
+                               "foreground-child": "^3.1.0",
+                               "jackspeak": "^2.3.5",
+                               "minimatch": "^9.0.1",
+                               "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
+                               "path-scurry": "^1.10.1"
+                       }
+               },
+               "glob-parent": {
+                       "version": "5.1.2",
+                       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+                       "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+                       "dev": true,
+                       "requires": {
+                               "is-glob": "^4.0.1"
+                       }
+               },
+               "glob-to-regexp": {
+                       "version": "0.4.1",
+                       "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+                       "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+                       "dev": true
+               },
+               "global-dirs": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+                       "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+                       "dev": true,
+                       "requires": {
+                               "ini": "2.0.0"
+                       },
+                       "dependencies": {
+                               "ini": {
+                                       "version": "2.0.0",
+                                       "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+                                       "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "globby": {
+                       "version": "11.1.0",
+                       "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+                       "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+                       "dev": true,
+                       "requires": {
+                               "array-union": "^2.1.0",
+                               "dir-glob": "^3.0.1",
+                               "fast-glob": "^3.2.9",
+                               "ignore": "^5.2.0",
+                               "merge2": "^1.4.1",
+                               "slash": "^3.0.0"
+                       }
+               },
+               "got": {
+                       "version": "12.6.1",
+                       "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
+                       "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
+                       "dev": true,
+                       "requires": {
+                               "@sindresorhus/is": "^5.2.0",
+                               "@szmarczak/http-timer": "^5.0.1",
+                               "cacheable-lookup": "^7.0.0",
+                               "cacheable-request": "^10.2.8",
+                               "decompress-response": "^6.0.0",
+                               "form-data-encoder": "^2.1.2",
+                               "get-stream": "^6.0.1",
+                               "http2-wrapper": "^2.1.10",
+                               "lowercase-keys": "^3.0.0",
+                               "p-cancelable": "^3.0.0",
+                               "responselike": "^3.0.0"
+                       }
+               },
+               "graceful-fs": {
+                       "version": "4.2.11",
+                       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+                       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+                       "dev": true
+               },
+               "has-flag": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+                       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+                       "dev": true
+               },
+               "has-unicode": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+                       "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+                       "dev": true
+               },
+               "has-yarn": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz",
+                       "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==",
+                       "dev": true
+               },
+               "hasown": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+                       "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+                       "dev": true,
+                       "requires": {
+                               "function-bind": "^1.1.2"
+                       }
+               },
+               "he": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+                       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+                       "dev": true
+               },
+               "hosted-git-info": {
+                       "version": "5.2.1",
+                       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz",
+                       "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==",
+                       "dev": true,
+                       "requires": {
+                               "lru-cache": "^7.5.1"
+                       }
+               },
+               "html-minifier-terser": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+                       "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+                       "dev": true,
+                       "requires": {
+                               "camel-case": "^4.1.2",
+                               "clean-css": "^5.2.2",
+                               "commander": "^8.3.0",
+                               "he": "^1.2.0",
+                               "param-case": "^3.0.4",
+                               "relateurl": "^0.2.7",
+                               "terser": "^5.10.0"
+                       }
+               },
+               "html-webpack-plugin": {
+                       "version": "5.5.4",
+                       "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.4.tgz",
+                       "integrity": "sha512-3wNSaVVxdxcu0jd4FpQFoICdqgxs4zIQQvj+2yQKFfBOnLETQ6X5CDWdeasuGlSsooFlMkEioWDTqBv1wvw5Iw==",
+                       "dev": true,
+                       "requires": {
+                               "@types/html-minifier-terser": "^6.0.0",
+                               "html-minifier-terser": "^6.0.2",
+                               "lodash": "^4.17.21",
+                               "pretty-error": "^4.0.0",
+                               "tapable": "^2.0.0"
+                       }
+               },
+               "htmlparser2": {
+                       "version": "6.1.0",
+                       "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+                       "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+                       "dev": true,
+                       "requires": {
+                               "domelementtype": "^2.0.1",
+                               "domhandler": "^4.0.0",
+                               "domutils": "^2.5.2",
+                               "entities": "^2.0.0"
+                       }
+               },
+               "http-cache-semantics": {
+                       "version": "4.1.1",
+                       "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+                       "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+                       "dev": true
+               },
+               "http-proxy-agent": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+                       "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+                       "dev": true,
+                       "requires": {
+                               "@tootallnate/once": "2",
+                               "agent-base": "6",
+                               "debug": "4"
+                       }
+               },
+               "http2-wrapper": {
+                       "version": "2.2.1",
+                       "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
+                       "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
+                       "dev": true,
+                       "requires": {
+                               "quick-lru": "^5.1.1",
+                               "resolve-alpn": "^1.2.0"
+                       },
+                       "dependencies": {
+                               "quick-lru": {
+                                       "version": "5.1.1",
+                                       "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+                                       "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "https-proxy-agent": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+                       "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+                       "dev": true,
+                       "requires": {
+                               "agent-base": "6",
+                               "debug": "4"
+                       }
+               },
+               "humanize-ms": {
+                       "version": "1.2.1",
+                       "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+                       "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+                       "dev": true,
+                       "requires": {
+                               "ms": "^2.0.0"
+                       }
+               },
+               "iconv-lite": {
+                       "version": "0.6.3",
+                       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+                       "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+                       "dev": true,
+                       "optional": true,
+                       "requires": {
+                               "safer-buffer": ">= 2.1.2 < 3.0.0"
+                       }
+               },
+               "icss-utils": {
+                       "version": "5.1.0",
+                       "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+                       "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "ieee754": {
+                       "version": "1.2.1",
+                       "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+                       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+               },
+               "ignore": {
+                       "version": "5.3.0",
+                       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
+                       "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+                       "dev": true
+               },
+               "ignore-walk": {
+                       "version": "6.0.4",
+                       "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz",
+                       "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==",
+                       "dev": true,
+                       "requires": {
+                               "minimatch": "^9.0.0"
+                       }
+               },
+               "import-lazy": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+                       "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+                       "dev": true
+               },
+               "import-local": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+                       "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+                       "dev": true,
+                       "requires": {
+                               "pkg-dir": "^4.2.0",
+                               "resolve-cwd": "^3.0.0"
+                       }
+               },
+               "imurmurhash": {
+                       "version": "0.1.4",
+                       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+                       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+                       "dev": true
+               },
+               "indent-string": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+                       "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+                       "dev": true
+               },
+               "infer-owner": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+                       "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+                       "dev": true
+               },
+               "inflight": {
+                       "version": "1.0.6",
+                       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+                       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+                       "dev": true,
+                       "requires": {
+                               "once": "^1.3.0",
+                               "wrappy": "1"
+                       }
+               },
+               "inherits": {
+                       "version": "2.0.4",
+                       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+                       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+                       "dev": true
+               },
+               "ini": {
+                       "version": "4.1.1",
+                       "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
+                       "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
+                       "dev": true
+               },
+               "interpret": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
+                       "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
+                       "dev": true
+               },
+               "ip": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+                       "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+                       "dev": true
+               },
+               "is-ci": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+                       "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+                       "dev": true,
+                       "requires": {
+                               "ci-info": "^3.2.0"
+                       }
+               },
+               "is-core-module": {
+                       "version": "2.13.1",
+                       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+                       "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+                       "dev": true,
+                       "requires": {
+                               "hasown": "^2.0.0"
+                       }
+               },
+               "is-extglob": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+                       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+                       "dev": true
+               },
+               "is-fullwidth-code-point": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+                       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+                       "dev": true
+               },
+               "is-glob": {
+                       "version": "4.0.3",
+                       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+                       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+                       "dev": true,
+                       "requires": {
+                               "is-extglob": "^2.1.1"
+                       }
+               },
+               "is-installed-globally": {
+                       "version": "0.4.0",
+                       "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+                       "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+                       "dev": true,
+                       "requires": {
+                               "global-dirs": "^3.0.0",
+                               "is-path-inside": "^3.0.2"
+                       }
+               },
+               "is-lambda": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+                       "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+                       "dev": true
+               },
+               "is-npm": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz",
+                       "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==",
+                       "dev": true
+               },
+               "is-number": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+                       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+                       "dev": true
+               },
+               "is-obj": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+                       "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+                       "dev": true
+               },
+               "is-path-inside": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+                       "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+                       "dev": true
+               },
+               "is-plain-object": {
+                       "version": "2.0.4",
+                       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+                       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+                       "dev": true,
+                       "requires": {
+                               "isobject": "^3.0.1"
+                       }
+               },
+               "is-typedarray": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+                       "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+                       "dev": true
+               },
+               "is-yarn-global": {
+                       "version": "0.4.1",
+                       "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz",
+                       "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==",
+                       "dev": true
+               },
+               "isexe": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+                       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+                       "dev": true
+               },
+               "isobject": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+                       "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+                       "dev": true
+               },
+               "jackspeak": {
+                       "version": "2.3.6",
+                       "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+                       "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+                       "dev": true,
+                       "requires": {
+                               "@isaacs/cliui": "^8.0.2",
+                               "@pkgjs/parseargs": "^0.11.0"
+                       }
+               },
+               "jest-util": {
+                       "version": "29.7.0",
+                       "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+                       "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+                       "dev": true,
+                       "requires": {
+                               "@jest/types": "^29.6.3",
+                               "@types/node": "*",
+                               "chalk": "^4.0.0",
+                               "ci-info": "^3.2.0",
+                               "graceful-fs": "^4.2.9",
+                               "picomatch": "^2.2.3"
+                       }
+               },
+               "jest-worker": {
+                       "version": "29.7.0",
+                       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+                       "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+                       "dev": true,
+                       "requires": {
+                               "@types/node": "*",
+                               "jest-util": "^29.7.0",
+                               "merge-stream": "^2.0.0",
+                               "supports-color": "^8.0.0"
+                       }
+               },
+               "jju": {
+                       "version": "1.4.0",
+                       "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
+                       "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
+                       "dev": true
+               },
+               "js-yaml": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+                       "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+                       "dev": true,
+                       "requires": {
+                               "argparse": "^2.0.1"
+                       }
+               },
+               "js2xmlparser": {
+                       "version": "4.0.2",
+                       "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz",
+                       "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
+                       "dev": true,
+                       "requires": {
+                               "xmlcreate": "^2.0.4"
+                       }
+               },
+               "jsdoc": {
+                       "version": "4.0.2",
+                       "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz",
+                       "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==",
+                       "dev": true,
+                       "requires": {
+                               "@babel/parser": "^7.20.15",
+                               "@jsdoc/salty": "^0.2.1",
+                               "@types/markdown-it": "^12.2.3",
+                               "bluebird": "^3.7.2",
+                               "catharsis": "^0.9.0",
+                               "escape-string-regexp": "^2.0.0",
+                               "js2xmlparser": "^4.0.2",
+                               "klaw": "^3.0.0",
+                               "markdown-it": "^12.3.2",
+                               "markdown-it-anchor": "^8.4.1",
+                               "marked": "^4.0.10",
+                               "mkdirp": "^1.0.4",
+                               "requizzle": "^0.2.3",
+                               "strip-json-comments": "^3.1.0",
+                               "underscore": "~1.13.2"
+                       }
+               },
+               "json-buffer": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+                       "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+                       "dev": true
+               },
+               "json-parse-even-better-errors": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz",
+                       "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==",
+                       "dev": true
+               },
+               "json-parse-helpfulerror": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz",
+                       "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==",
+                       "dev": true,
+                       "requires": {
+                               "jju": "^1.1.0"
+                       }
+               },
+               "json-schema-traverse": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+                       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+                       "dev": true
+               },
+               "json5": {
+                       "version": "2.2.3",
+                       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+                       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+                       "dev": true
+               },
+               "jsonlines": {
+                       "version": "0.1.1",
+                       "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz",
+                       "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==",
+                       "dev": true
+               },
+               "jsonparse": {
+                       "version": "1.3.1",
+                       "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+                       "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+                       "dev": true
+               },
+               "keyv": {
+                       "version": "4.5.4",
+                       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+                       "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+                       "dev": true,
+                       "requires": {
+                               "json-buffer": "3.0.1"
+                       }
+               },
+               "kind-of": {
+                       "version": "6.0.3",
+                       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+                       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+                       "dev": true
+               },
+               "klaw": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz",
+                       "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+                       "dev": true,
+                       "requires": {
+                               "graceful-fs": "^4.1.9"
+                       }
+               },
+               "kleur": {
+                       "version": "4.1.5",
+                       "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+                       "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+                       "dev": true
+               },
+               "latest-version": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
+                       "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
+                       "dev": true,
+                       "requires": {
+                               "package-json": "^8.1.0"
+                       }
+               },
+               "lerc": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/lerc/-/lerc-3.0.0.tgz",
+                       "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww=="
+               },
+               "lilconfig": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+                       "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+                       "dev": true
+               },
+               "linkify-it": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
+                       "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+                       "dev": true,
+                       "requires": {
+                               "uc.micro": "^1.0.1"
+                       }
+               },
+               "loader-runner": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+                       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+                       "dev": true
+               },
+               "locate-path": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+                       "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+                       "dev": true,
+                       "requires": {
+                               "p-locate": "^5.0.0"
+                       }
+               },
+               "lodash": {
+                       "version": "4.17.21",
+                       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+                       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+                       "dev": true
+               },
+               "lodash.memoize": {
+                       "version": "4.1.2",
+                       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+                       "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+                       "dev": true
+               },
+               "lodash.uniq": {
+                       "version": "4.5.0",
+                       "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+                       "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+                       "dev": true
+               },
+               "lower-case": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+                       "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+                       "dev": true,
+                       "requires": {
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "lowercase-keys": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+                       "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+                       "dev": true
+               },
+               "lru-cache": {
+                       "version": "7.18.3",
+                       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+                       "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+                       "dev": true
+               },
+               "make-fetch-happen": {
+                       "version": "11.1.1",
+                       "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz",
+                       "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==",
+                       "dev": true,
+                       "requires": {
+                               "agentkeepalive": "^4.2.1",
+                               "cacache": "^17.0.0",
+                               "http-cache-semantics": "^4.1.1",
+                               "http-proxy-agent": "^5.0.0",
+                               "https-proxy-agent": "^5.0.0",
+                               "is-lambda": "^1.0.1",
+                               "lru-cache": "^7.7.1",
+                               "minipass": "^5.0.0",
+                               "minipass-fetch": "^3.0.0",
+                               "minipass-flush": "^1.0.5",
+                               "minipass-pipeline": "^1.2.4",
+                               "negotiator": "^0.6.3",
+                               "promise-retry": "^2.0.1",
+                               "socks-proxy-agent": "^7.0.0",
+                               "ssri": "^10.0.0"
+                       }
+               },
+               "markdown-it": {
+                       "version": "12.3.2",
+                       "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
+                       "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+                       "dev": true,
+                       "requires": {
+                               "argparse": "^2.0.1",
+                               "entities": "~2.1.0",
+                               "linkify-it": "^3.0.1",
+                               "mdurl": "^1.0.1",
+                               "uc.micro": "^1.0.5"
+                       }
+               },
+               "markdown-it-anchor": {
+                       "version": "8.6.7",
+                       "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
+                       "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "marked": {
+                       "version": "4.3.0",
+                       "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+                       "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+                       "dev": true
+               },
+               "mdn-data": {
+                       "version": "2.0.30",
+                       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+                       "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+                       "dev": true
+               },
+               "mdurl": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+                       "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+                       "dev": true
+               },
+               "merge-stream": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+                       "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+                       "dev": true
+               },
+               "merge2": {
+                       "version": "1.4.1",
+                       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+                       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+                       "dev": true
+               },
+               "micromatch": {
+                       "version": "4.0.5",
+                       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+                       "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+                       "dev": true,
+                       "requires": {
+                               "braces": "^3.0.2",
+                               "picomatch": "^2.3.1"
+                       }
+               },
+               "mime-db": {
+                       "version": "1.52.0",
+                       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+                       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+                       "dev": true
+               },
+               "mime-types": {
+                       "version": "2.1.35",
+                       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+                       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+                       "dev": true,
+                       "requires": {
+                               "mime-db": "1.52.0"
+                       }
+               },
+               "mimic-response": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
+                       "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+                       "dev": true
+               },
+               "mini-css-extract-plugin": {
+                       "version": "2.7.6",
+                       "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz",
+                       "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==",
+                       "dev": true,
+                       "requires": {
+                               "schema-utils": "^4.0.0"
+                       }
+               },
+               "minimatch": {
+                       "version": "9.0.3",
+                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+                       "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+                       "dev": true,
+                       "requires": {
+                               "brace-expansion": "^2.0.1"
+                       }
+               },
+               "minimist": {
+                       "version": "1.2.8",
+                       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+                       "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+                       "dev": true
+               },
+               "minipass": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+                       "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+                       "dev": true
+               },
+               "minipass-collect": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+                       "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+                       "dev": true,
+                       "requires": {
+                               "minipass": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "3.3.6",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "minipass-fetch": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz",
+                       "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==",
+                       "dev": true,
+                       "requires": {
+                               "encoding": "^0.1.13",
+                               "minipass": "^7.0.3",
+                               "minipass-sized": "^1.0.3",
+                               "minizlib": "^2.1.2"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "7.0.4",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "minipass-flush": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+                       "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+                       "dev": true,
+                       "requires": {
+                               "minipass": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "3.3.6",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "minipass-json-stream": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz",
+                       "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==",
+                       "dev": true,
+                       "requires": {
+                               "jsonparse": "^1.3.1",
+                               "minipass": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "3.3.6",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "minipass-pipeline": {
+                       "version": "1.2.4",
+                       "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+                       "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+                       "dev": true,
+                       "requires": {
+                               "minipass": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "3.3.6",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "minipass-sized": {
+                       "version": "1.0.3",
+                       "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+                       "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+                       "dev": true,
+                       "requires": {
+                               "minipass": "^3.0.0"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "3.3.6",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "minizlib": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+                       "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+                       "dev": true,
+                       "requires": {
+                               "minipass": "^3.0.0",
+                               "yallist": "^4.0.0"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "3.3.6",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "mkdirp": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+                       "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+                       "dev": true
+               },
+               "ms": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+                       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+                       "dev": true
+               },
+               "nanoid": {
+                       "version": "3.3.7",
+                       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+                       "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+                       "dev": true
+               },
+               "negotiator": {
+                       "version": "0.6.3",
+                       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+                       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+                       "dev": true
+               },
+               "neo-async": {
+                       "version": "2.6.2",
+                       "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+                       "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+                       "dev": true
+               },
+               "no-case": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+                       "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+                       "dev": true,
+                       "requires": {
+                               "lower-case": "^2.0.2",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "node-gyp": {
+                       "version": "9.4.1",
+                       "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz",
+                       "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==",
+                       "dev": true,
+                       "requires": {
+                               "env-paths": "^2.2.0",
+                               "exponential-backoff": "^3.1.1",
+                               "glob": "^7.1.4",
+                               "graceful-fs": "^4.2.6",
+                               "make-fetch-happen": "^10.0.3",
+                               "nopt": "^6.0.0",
+                               "npmlog": "^6.0.0",
+                               "rimraf": "^3.0.2",
+                               "semver": "^7.3.5",
+                               "tar": "^6.1.2",
+                               "which": "^2.0.2"
+                       },
+                       "dependencies": {
+                               "@npmcli/fs": {
+                                       "version": "2.1.2",
+                                       "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz",
+                                       "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==",
+                                       "dev": true,
+                                       "requires": {
+                                               "@gar/promisify": "^1.1.3",
+                                               "semver": "^7.3.5"
+                                       }
+                               },
+                               "brace-expansion": {
+                                       "version": "1.1.11",
+                                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+                                       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "balanced-match": "^1.0.0",
+                                               "concat-map": "0.0.1"
+                                       }
+                               },
+                               "cacache": {
+                                       "version": "16.1.3",
+                                       "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz",
+                                       "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==",
+                                       "dev": true,
+                                       "requires": {
+                                               "@npmcli/fs": "^2.1.0",
+                                               "@npmcli/move-file": "^2.0.0",
+                                               "chownr": "^2.0.0",
+                                               "fs-minipass": "^2.1.0",
+                                               "glob": "^8.0.1",
+                                               "infer-owner": "^1.0.4",
+                                               "lru-cache": "^7.7.1",
+                                               "minipass": "^3.1.6",
+                                               "minipass-collect": "^1.0.2",
+                                               "minipass-flush": "^1.0.5",
+                                               "minipass-pipeline": "^1.2.4",
+                                               "mkdirp": "^1.0.4",
+                                               "p-map": "^4.0.0",
+                                               "promise-inflight": "^1.0.1",
+                                               "rimraf": "^3.0.2",
+                                               "ssri": "^9.0.0",
+                                               "tar": "^6.1.11",
+                                               "unique-filename": "^2.0.0"
+                                       },
+                                       "dependencies": {
+                                               "brace-expansion": {
+                                                       "version": "2.0.1",
+                                                       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+                                                       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+                                                       "dev": true,
+                                                       "requires": {
+                                                               "balanced-match": "^1.0.0"
+                                                       }
+                                               },
+                                               "glob": {
+                                                       "version": "8.1.0",
+                                                       "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+                                                       "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+                                                       "dev": true,
+                                                       "requires": {
+                                                               "fs.realpath": "^1.0.0",
+                                                               "inflight": "^1.0.4",
+                                                               "inherits": "2",
+                                                               "minimatch": "^5.0.1",
+                                                               "once": "^1.3.0"
+                                                       }
+                                               },
+                                               "minimatch": {
+                                                       "version": "5.1.6",
+                                                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+                                                       "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+                                                       "dev": true,
+                                                       "requires": {
+                                                               "brace-expansion": "^2.0.1"
+                                                       }
+                                               }
+                                       }
+                               },
+                               "fs-minipass": {
+                                       "version": "2.1.0",
+                                       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+                                       "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "minipass": "^3.0.0"
+                                       }
+                               },
+                               "glob": {
+                                       "version": "7.2.3",
+                                       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+                                       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+                                       "dev": true,
+                                       "requires": {
+                                               "fs.realpath": "^1.0.0",
+                                               "inflight": "^1.0.4",
+                                               "inherits": "2",
+                                               "minimatch": "^3.1.1",
+                                               "once": "^1.3.0",
+                                               "path-is-absolute": "^1.0.0"
+                                       }
+                               },
+                               "make-fetch-happen": {
+                                       "version": "10.2.1",
+                                       "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz",
+                                       "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==",
+                                       "dev": true,
+                                       "requires": {
+                                               "agentkeepalive": "^4.2.1",
+                                               "cacache": "^16.1.0",
+                                               "http-cache-semantics": "^4.1.0",
+                                               "http-proxy-agent": "^5.0.0",
+                                               "https-proxy-agent": "^5.0.0",
+                                               "is-lambda": "^1.0.1",
+                                               "lru-cache": "^7.7.1",
+                                               "minipass": "^3.1.6",
+                                               "minipass-collect": "^1.0.2",
+                                               "minipass-fetch": "^2.0.3",
+                                               "minipass-flush": "^1.0.5",
+                                               "minipass-pipeline": "^1.2.4",
+                                               "negotiator": "^0.6.3",
+                                               "promise-retry": "^2.0.1",
+                                               "socks-proxy-agent": "^7.0.0",
+                                               "ssri": "^9.0.0"
+                                       }
+                               },
+                               "minimatch": {
+                                       "version": "3.1.2",
+                                       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+                                       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "brace-expansion": "^1.1.7"
+                                       }
+                               },
+                               "minipass": {
+                                       "version": "3.3.6",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               },
+                               "minipass-fetch": {
+                                       "version": "2.1.2",
+                                       "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz",
+                                       "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "encoding": "^0.1.13",
+                                               "minipass": "^3.1.6",
+                                               "minipass-sized": "^1.0.3",
+                                               "minizlib": "^2.1.2"
+                                       }
+                               },
+                               "rimraf": {
+                                       "version": "3.0.2",
+                                       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+                                       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "glob": "^7.1.3"
+                                       }
+                               },
+                               "ssri": {
+                                       "version": "9.0.1",
+                                       "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz",
+                                       "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==",
+                                       "dev": true,
+                                       "requires": {
+                                               "minipass": "^3.1.1"
+                                       }
+                               },
+                               "unique-filename": {
+                                       "version": "2.0.1",
+                                       "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz",
+                                       "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==",
+                                       "dev": true,
+                                       "requires": {
+                                               "unique-slug": "^3.0.0"
+                                       }
+                               },
+                               "unique-slug": {
+                                       "version": "3.0.0",
+                                       "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz",
+                                       "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==",
+                                       "dev": true,
+                                       "requires": {
+                                               "imurmurhash": "^0.1.4"
+                                       }
+                               }
+                       }
+               },
+               "node-releases": {
+                       "version": "2.0.14",
+                       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+                       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+                       "dev": true
+               },
+               "nopt": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
+                       "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
+                       "dev": true,
+                       "requires": {
+                               "abbrev": "^1.0.0"
+                       }
+               },
+               "normalize-package-data": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz",
+                       "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==",
+                       "dev": true,
+                       "requires": {
+                               "hosted-git-info": "^6.0.0",
+                               "is-core-module": "^2.8.1",
+                               "semver": "^7.3.5",
+                               "validate-npm-package-license": "^3.0.4"
+                       },
+                       "dependencies": {
+                               "hosted-git-info": {
+                                       "version": "6.1.1",
+                                       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz",
+                                       "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==",
+                                       "dev": true,
+                                       "requires": {
+                                               "lru-cache": "^7.5.1"
+                                       }
+                               }
+                       }
+               },
+               "normalize-url": {
+                       "version": "8.0.0",
+                       "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
+                       "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
+                       "dev": true
+               },
+               "npm-bundled": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz",
+                       "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==",
+                       "dev": true,
+                       "requires": {
+                               "npm-normalize-package-bin": "^3.0.0"
+                       }
+               },
+               "npm-check-updates": {
+                       "version": "16.14.12",
+                       "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.12.tgz",
+                       "integrity": "sha512-5FvqaDX8AqWWTDQFbBllgLwoRXTvzlqVIRSKl9Kg8bYZTfNwMnrp1Zlmb5e/ocf11UjPTc+ShBFjYQ7kg6FL0w==",
+                       "dev": true,
+                       "requires": {
+                               "chalk": "^5.3.0",
+                               "cli-table3": "^0.6.3",
+                               "commander": "^10.0.1",
+                               "fast-memoize": "^2.5.2",
+                               "find-up": "5.0.0",
+                               "fp-and-or": "^0.1.4",
+                               "get-stdin": "^8.0.0",
+                               "globby": "^11.0.4",
+                               "hosted-git-info": "^5.1.0",
+                               "ini": "^4.1.1",
+                               "js-yaml": "^4.1.0",
+                               "json-parse-helpfulerror": "^1.0.3",
+                               "jsonlines": "^0.1.1",
+                               "lodash": "^4.17.21",
+                               "make-fetch-happen": "^11.1.1",
+                               "minimatch": "^9.0.3",
+                               "p-map": "^4.0.0",
+                               "pacote": "15.2.0",
+                               "parse-github-url": "^1.0.2",
+                               "progress": "^2.0.3",
+                               "prompts-ncu": "^3.0.0",
+                               "rc-config-loader": "^4.1.3",
+                               "remote-git-tags": "^3.0.0",
+                               "rimraf": "^5.0.5",
+                               "semver": "^7.5.4",
+                               "semver-utils": "^1.1.4",
+                               "source-map-support": "^0.5.21",
+                               "spawn-please": "^2.0.2",
+                               "strip-ansi": "^7.1.0",
+                               "strip-json-comments": "^5.0.1",
+                               "untildify": "^4.0.0",
+                               "update-notifier": "^6.0.2"
+                       },
+                       "dependencies": {
+                               "chalk": {
+                                       "version": "5.3.0",
+                                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+                                       "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+                                       "dev": true
+                               },
+                               "commander": {
+                                       "version": "10.0.1",
+                                       "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+                                       "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+                                       "dev": true
+                               },
+                               "strip-json-comments": {
+                                       "version": "5.0.1",
+                                       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz",
+                                       "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "npm-install-checks": {
+                       "version": "6.3.0",
+                       "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz",
+                       "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==",
+                       "dev": true,
+                       "requires": {
+                               "semver": "^7.1.1"
+                       }
+               },
+               "npm-normalize-package-bin": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz",
+                       "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==",
+                       "dev": true
+               },
+               "npm-package-arg": {
+                       "version": "10.1.0",
+                       "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz",
+                       "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==",
+                       "dev": true,
+                       "requires": {
+                               "hosted-git-info": "^6.0.0",
+                               "proc-log": "^3.0.0",
+                               "semver": "^7.3.5",
+                               "validate-npm-package-name": "^5.0.0"
+                       },
+                       "dependencies": {
+                               "hosted-git-info": {
+                                       "version": "6.1.1",
+                                       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz",
+                                       "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==",
+                                       "dev": true,
+                                       "requires": {
+                                               "lru-cache": "^7.5.1"
+                                       }
+                               }
+                       }
+               },
+               "npm-packlist": {
+                       "version": "7.0.4",
+                       "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz",
+                       "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==",
+                       "dev": true,
+                       "requires": {
+                               "ignore-walk": "^6.0.0"
+                       }
+               },
+               "npm-pick-manifest": {
+                       "version": "8.0.2",
+                       "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz",
+                       "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==",
+                       "dev": true,
+                       "requires": {
+                               "npm-install-checks": "^6.0.0",
+                               "npm-normalize-package-bin": "^3.0.0",
+                               "npm-package-arg": "^10.0.0",
+                               "semver": "^7.3.5"
+                       }
+               },
+               "npm-registry-fetch": {
+                       "version": "14.0.5",
+                       "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz",
+                       "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==",
+                       "dev": true,
+                       "requires": {
+                               "make-fetch-happen": "^11.0.0",
+                               "minipass": "^5.0.0",
+                               "minipass-fetch": "^3.0.0",
+                               "minipass-json-stream": "^1.0.1",
+                               "minizlib": "^2.1.2",
+                               "npm-package-arg": "^10.0.0",
+                               "proc-log": "^3.0.0"
+                       }
+               },
+               "npmlog": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+                       "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+                       "dev": true,
+                       "requires": {
+                               "are-we-there-yet": "^3.0.0",
+                               "console-control-strings": "^1.1.0",
+                               "gauge": "^4.0.3",
+                               "set-blocking": "^2.0.0"
+                       }
+               },
+               "nth-check": {
+                       "version": "2.1.1",
+                       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+                       "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+                       "dev": true,
+                       "requires": {
+                               "boolbase": "^1.0.0"
+                       }
+               },
+               "ol": {
+                       "version": "8.2.0",
+                       "resolved": "https://registry.npmjs.org/ol/-/ol-8.2.0.tgz",
+                       "integrity": "sha512-/m1ddd7Jsp4Kbg+l7+ozR5aKHAZNQOBAoNZ5pM9Jvh4Etkf0WGkXr9qXd7PnhmwiC1Hnc2Toz9XjCzBBvexfXw==",
+                       "requires": {
+                               "color-rgba": "^3.0.0",
+                               "color-space": "^2.0.1",
+                               "earcut": "^2.2.3",
+                               "geotiff": "^2.0.7",
+                               "pbf": "3.2.1",
+                               "rbush": "^3.0.1"
+                       }
+               },
+               "once": {
+                       "version": "1.4.0",
+                       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+                       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+                       "dev": true,
+                       "requires": {
+                               "wrappy": "1"
+                       }
+               },
+               "p-cancelable": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+                       "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+                       "dev": true
+               },
+               "p-limit": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+                       "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+                       "dev": true,
+                       "requires": {
+                               "yocto-queue": "^0.1.0"
+                       }
+               },
+               "p-locate": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+                       "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+                       "dev": true,
+                       "requires": {
+                               "p-limit": "^3.0.2"
+                       }
+               },
+               "p-map": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+                       "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+                       "dev": true,
+                       "requires": {
+                               "aggregate-error": "^3.0.0"
+                       }
+               },
+               "p-try": {
+                       "version": "2.2.0",
+                       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+                       "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+                       "dev": true
+               },
+               "package-json": {
+                       "version": "8.1.1",
+                       "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz",
+                       "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==",
+                       "dev": true,
+                       "requires": {
+                               "got": "^12.1.0",
+                               "registry-auth-token": "^5.0.1",
+                               "registry-url": "^6.0.0",
+                               "semver": "^7.3.7"
+                       }
+               },
+               "pacote": {
+                       "version": "15.2.0",
+                       "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz",
+                       "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==",
+                       "dev": true,
+                       "requires": {
+                               "@npmcli/git": "^4.0.0",
+                               "@npmcli/installed-package-contents": "^2.0.1",
+                               "@npmcli/promise-spawn": "^6.0.1",
+                               "@npmcli/run-script": "^6.0.0",
+                               "cacache": "^17.0.0",
+                               "fs-minipass": "^3.0.0",
+                               "minipass": "^5.0.0",
+                               "npm-package-arg": "^10.0.0",
+                               "npm-packlist": "^7.0.0",
+                               "npm-pick-manifest": "^8.0.0",
+                               "npm-registry-fetch": "^14.0.0",
+                               "proc-log": "^3.0.0",
+                               "promise-retry": "^2.0.1",
+                               "read-package-json": "^6.0.0",
+                               "read-package-json-fast": "^3.0.0",
+                               "sigstore": "^1.3.0",
+                               "ssri": "^10.0.0",
+                               "tar": "^6.1.11"
+                       }
+               },
+               "pako": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
+                       "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
+               },
+               "param-case": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+                       "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+                       "dev": true,
+                       "requires": {
+                               "dot-case": "^3.0.4",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "parse-github-url": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz",
+                       "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==",
+                       "dev": true
+               },
+               "parse-headers": {
+                       "version": "2.0.5",
+                       "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+                       "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+               },
+               "pascal-case": {
+                       "version": "3.1.2",
+                       "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+                       "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+                       "dev": true,
+                       "requires": {
+                               "no-case": "^3.0.4",
+                               "tslib": "^2.0.3"
+                       }
+               },
+               "path-exists": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+                       "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+                       "dev": true
+               },
+               "path-is-absolute": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+                       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+                       "dev": true
+               },
+               "path-key": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+                       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+                       "dev": true
+               },
+               "path-parse": {
+                       "version": "1.0.7",
+                       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+                       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+                       "dev": true
+               },
+               "path-scurry": {
+                       "version": "1.10.1",
+                       "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
+                       "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+                       "dev": true,
+                       "requires": {
+                               "lru-cache": "^9.1.1 || ^10.0.0",
+                               "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+                       },
+                       "dependencies": {
+                               "lru-cache": {
+                                       "version": "10.1.0",
+                                       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
+                                       "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "path-type": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+                       "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+                       "dev": true
+               },
+               "pbf": {
+                       "version": "3.2.1",
+                       "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
+                       "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
+                       "requires": {
+                               "ieee754": "^1.1.12",
+                               "resolve-protobuf-schema": "^2.1.0"
+                       }
+               },
+               "picocolors": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+                       "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+                       "dev": true
+               },
+               "picomatch": {
+                       "version": "2.3.1",
+                       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+                       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+                       "dev": true
+               },
+               "pkg-dir": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+                       "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+                       "dev": true,
+                       "requires": {
+                               "find-up": "^4.0.0"
+                       },
+                       "dependencies": {
+                               "find-up": {
+                                       "version": "4.1.0",
+                                       "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+                                       "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+                                       "dev": true,
+                                       "requires": {
+                                               "locate-path": "^5.0.0",
+                                               "path-exists": "^4.0.0"
+                                       }
+                               },
+                               "locate-path": {
+                                       "version": "5.0.0",
+                                       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+                                       "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+                                       "dev": true,
+                                       "requires": {
+                                               "p-locate": "^4.1.0"
+                                       }
+                               },
+                               "p-limit": {
+                                       "version": "2.3.0",
+                                       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+                                       "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+                                       "dev": true,
+                                       "requires": {
+                                               "p-try": "^2.0.0"
+                                       }
+                               },
+                               "p-locate": {
+                                       "version": "4.1.0",
+                                       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+                                       "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+                                       "dev": true,
+                                       "requires": {
+                                               "p-limit": "^2.2.0"
+                                       }
+                               }
+                       }
+               },
+               "postcss": {
+                       "version": "8.4.32",
+                       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+                       "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
+                       "dev": true,
+                       "requires": {
+                               "nanoid": "^3.3.7",
+                               "picocolors": "^1.0.0",
+                               "source-map-js": "^1.0.2"
+                       }
+               },
+               "postcss-calc": {
+                       "version": "9.0.1",
+                       "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
+                       "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-selector-parser": "^6.0.11",
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-colormin": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz",
+                       "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.21.4",
+                               "caniuse-api": "^3.0.0",
+                               "colord": "^2.9.1",
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-convert-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz",
+                       "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.21.4",
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-discard-comments": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz",
+                       "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "postcss-discard-duplicates": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz",
+                       "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "postcss-discard-empty": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz",
+                       "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "postcss-discard-overridden": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz",
+                       "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "postcss-merge-longhand": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz",
+                       "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0",
+                               "stylehacks": "^6.0.0"
+                       }
+               },
+               "postcss-merge-rules": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz",
+                       "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.21.4",
+                               "caniuse-api": "^3.0.0",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-selector-parser": "^6.0.5"
+                       }
+               },
+               "postcss-minify-font-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz",
+                       "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-minify-gradients": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz",
+                       "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==",
+                       "dev": true,
+                       "requires": {
+                               "colord": "^2.9.1",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-minify-params": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz",
+                       "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.21.4",
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-minify-selectors": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz",
+                       "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-selector-parser": "^6.0.5"
+                       }
+               },
+               "postcss-modules-extract-imports": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+                       "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "postcss-modules-local-by-default": {
+                       "version": "4.0.3",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
+                       "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
+                       "dev": true,
+                       "requires": {
+                               "icss-utils": "^5.0.0",
+                               "postcss-selector-parser": "^6.0.2",
+                               "postcss-value-parser": "^4.1.0"
+                       }
+               },
+               "postcss-modules-scope": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+                       "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-selector-parser": "^6.0.4"
+                       }
+               },
+               "postcss-modules-values": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+                       "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+                       "dev": true,
+                       "requires": {
+                               "icss-utils": "^5.0.0"
+                       }
+               },
+               "postcss-normalize-charset": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz",
+                       "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "postcss-normalize-display-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz",
+                       "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-normalize-positions": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz",
+                       "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-normalize-repeat-style": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz",
+                       "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-normalize-string": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz",
+                       "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-normalize-timing-functions": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz",
+                       "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-normalize-unicode": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz",
+                       "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.21.4",
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-normalize-url": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz",
+                       "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-normalize-whitespace": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz",
+                       "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-ordered-values": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz",
+                       "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==",
+                       "dev": true,
+                       "requires": {
+                               "cssnano-utils": "^4.0.0",
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-reduce-initial": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz",
+                       "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.21.4",
+                               "caniuse-api": "^3.0.0"
+                       }
+               },
+               "postcss-reduce-transforms": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz",
+                       "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0"
+                       }
+               },
+               "postcss-selector-parser": {
+                       "version": "6.0.13",
+                       "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+                       "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+                       "dev": true,
+                       "requires": {
+                               "cssesc": "^3.0.0",
+                               "util-deprecate": "^1.0.2"
+                       }
+               },
+               "postcss-svgo": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz",
+                       "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-value-parser": "^4.2.0",
+                               "svgo": "^3.0.2"
+                       }
+               },
+               "postcss-unique-selectors": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz",
+                       "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==",
+                       "dev": true,
+                       "requires": {
+                               "postcss-selector-parser": "^6.0.5"
+                       }
+               },
+               "postcss-value-parser": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+                       "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+                       "dev": true
+               },
+               "pretty-error": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
+                       "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+                       "dev": true,
+                       "requires": {
+                               "lodash": "^4.17.20",
+                               "renderkid": "^3.0.0"
+                       }
+               },
+               "proc-log": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+                       "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+                       "dev": true
+               },
+               "progress": {
+                       "version": "2.0.3",
+                       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+                       "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+                       "dev": true
+               },
+               "promise-inflight": {
+                       "version": "1.0.1",
+                       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+                       "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+                       "dev": true
+               },
+               "promise-retry": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+                       "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+                       "dev": true,
+                       "requires": {
+                               "err-code": "^2.0.2",
+                               "retry": "^0.12.0"
+                       }
+               },
+               "prompts-ncu": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.0.tgz",
+                       "integrity": "sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==",
+                       "dev": true,
+                       "requires": {
+                               "kleur": "^4.0.1",
+                               "sisteransi": "^1.0.5"
+                       }
+               },
+               "proto-list": {
+                       "version": "1.2.4",
+                       "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+                       "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+                       "dev": true
+               },
+               "protocol-buffers-schema": {
+                       "version": "3.6.0",
+                       "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
+                       "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
+               },
+               "punycode": {
+                       "version": "2.3.1",
+                       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+                       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+                       "dev": true
+               },
+               "pupa": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz",
+                       "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==",
+                       "dev": true,
+                       "requires": {
+                               "escape-goat": "^4.0.0"
+                       }
+               },
+               "queue-microtask": {
+                       "version": "1.2.3",
+                       "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+                       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+                       "dev": true
+               },
+               "quick-lru": {
+                       "version": "6.1.2",
+                       "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
+                       "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ=="
+               },
+               "quickselect": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
+                       "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
+               },
+               "randombytes": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+                       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+                       "dev": true,
+                       "requires": {
+                               "safe-buffer": "^5.1.0"
+                       }
+               },
+               "rbush": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
+                       "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
+                       "requires": {
+                               "quickselect": "^2.0.0"
+                       }
+               },
+               "rc": {
+                       "version": "1.2.8",
+                       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+                       "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+                       "dev": true,
+                       "requires": {
+                               "deep-extend": "^0.6.0",
+                               "ini": "~1.3.0",
+                               "minimist": "^1.2.0",
+                               "strip-json-comments": "~2.0.1"
+                       },
+                       "dependencies": {
+                               "ini": {
+                                       "version": "1.3.8",
+                                       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+                                       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+                                       "dev": true
+                               },
+                               "strip-json-comments": {
+                                       "version": "2.0.1",
+                                       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+                                       "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "rc-config-loader": {
+                       "version": "4.1.3",
+                       "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz",
+                       "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==",
+                       "dev": true,
+                       "requires": {
+                               "debug": "^4.3.4",
+                               "js-yaml": "^4.1.0",
+                               "json5": "^2.2.2",
+                               "require-from-string": "^2.0.2"
+                       }
+               },
+               "read-package-json": {
+                       "version": "6.0.4",
+                       "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz",
+                       "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==",
+                       "dev": true,
+                       "requires": {
+                               "glob": "^10.2.2",
+                               "json-parse-even-better-errors": "^3.0.0",
+                               "normalize-package-data": "^5.0.0",
+                               "npm-normalize-package-bin": "^3.0.0"
+                       }
+               },
+               "read-package-json-fast": {
+                       "version": "3.0.2",
+                       "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz",
+                       "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==",
+                       "dev": true,
+                       "requires": {
+                               "json-parse-even-better-errors": "^3.0.0",
+                               "npm-normalize-package-bin": "^3.0.0"
+                       }
+               },
+               "readable-stream": {
+                       "version": "3.6.2",
+                       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+                       "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+                       "dev": true,
+                       "requires": {
+                               "inherits": "^2.0.3",
+                               "string_decoder": "^1.1.1",
+                               "util-deprecate": "^1.0.1"
+                       }
+               },
+               "rechoir": {
+                       "version": "0.8.0",
+                       "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+                       "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+                       "dev": true,
+                       "requires": {
+                               "resolve": "^1.20.0"
+                       }
+               },
+               "registry-auth-token": {
+                       "version": "5.0.2",
+                       "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz",
+                       "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==",
+                       "dev": true,
+                       "requires": {
+                               "@pnpm/npm-conf": "^2.1.0"
+                       }
+               },
+               "registry-url": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
+                       "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
+                       "dev": true,
+                       "requires": {
+                               "rc": "1.2.8"
+                       }
+               },
+               "relateurl": {
+                       "version": "0.2.7",
+                       "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+                       "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+                       "dev": true
+               },
+               "remote-git-tags": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz",
+                       "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==",
+                       "dev": true
+               },
+               "renderkid": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
+                       "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+                       "dev": true,
+                       "requires": {
+                               "css-select": "^4.1.3",
+                               "dom-converter": "^0.2.0",
+                               "htmlparser2": "^6.1.0",
+                               "lodash": "^4.17.21",
+                               "strip-ansi": "^6.0.1"
+                       },
+                       "dependencies": {
+                               "ansi-regex": {
+                                       "version": "5.0.1",
+                                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                                       "dev": true
+                               },
+                               "strip-ansi": {
+                                       "version": "6.0.1",
+                                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                                       "dev": true,
+                                       "requires": {
+                                               "ansi-regex": "^5.0.1"
+                                       }
+                               }
+                       }
+               },
+               "require-from-string": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+                       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+                       "dev": true
+               },
+               "requizzle": {
+                       "version": "0.2.4",
+                       "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz",
+                       "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==",
+                       "dev": true,
+                       "requires": {
+                               "lodash": "^4.17.21"
+                       }
+               },
+               "resolve": {
+                       "version": "1.22.8",
+                       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+                       "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+                       "dev": true,
+                       "requires": {
+                               "is-core-module": "^2.13.0",
+                               "path-parse": "^1.0.7",
+                               "supports-preserve-symlinks-flag": "^1.0.0"
+                       }
+               },
+               "resolve-alpn": {
+                       "version": "1.2.1",
+                       "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+                       "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+                       "dev": true
+               },
+               "resolve-cwd": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+                       "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+                       "dev": true,
+                       "requires": {
+                               "resolve-from": "^5.0.0"
+                       }
+               },
+               "resolve-from": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+                       "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+                       "dev": true
+               },
+               "resolve-protobuf-schema": {
+                       "version": "2.1.0",
+                       "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
+                       "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
+                       "requires": {
+                               "protocol-buffers-schema": "^3.3.1"
+                       }
+               },
+               "responselike": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
+                       "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+                       "dev": true,
+                       "requires": {
+                               "lowercase-keys": "^3.0.0"
+                       }
+               },
+               "retry": {
+                       "version": "0.12.0",
+                       "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+                       "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+                       "dev": true
+               },
+               "reusify": {
+                       "version": "1.0.4",
+                       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+                       "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+                       "dev": true
+               },
+               "rimraf": {
+                       "version": "5.0.5",
+                       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz",
+                       "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==",
+                       "dev": true,
+                       "requires": {
+                               "glob": "^10.3.7"
+                       }
+               },
+               "run-parallel": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+                       "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+                       "dev": true,
+                       "requires": {
+                               "queue-microtask": "^1.2.2"
+                       }
+               },
+               "safe-buffer": {
+                       "version": "5.2.1",
+                       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+                       "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+                       "dev": true
+               },
+               "safer-buffer": {
+                       "version": "2.1.2",
+                       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+                       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+                       "dev": true,
+                       "optional": true
+               },
+               "schema-utils": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
+                       "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+                       "dev": true,
+                       "requires": {
+                               "@types/json-schema": "^7.0.9",
+                               "ajv": "^8.9.0",
+                               "ajv-formats": "^2.1.1",
+                               "ajv-keywords": "^5.1.0"
+                       }
+               },
+               "semver": {
+                       "version": "7.5.4",
+                       "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+                       "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+                       "dev": true,
+                       "requires": {
+                               "lru-cache": "^6.0.0"
+                       },
+                       "dependencies": {
+                               "lru-cache": {
+                                       "version": "6.0.0",
+                                       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+                                       "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "yallist": "^4.0.0"
+                                       }
+                               }
+                       }
+               },
+               "semver-diff": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
+                       "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
+                       "dev": true,
+                       "requires": {
+                               "semver": "^7.3.5"
+                       }
+               },
+               "semver-utils": {
+                       "version": "1.1.4",
+                       "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz",
+                       "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==",
+                       "dev": true
+               },
+               "serialize-javascript": {
+                       "version": "6.0.1",
+                       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+                       "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+                       "dev": true,
+                       "requires": {
+                               "randombytes": "^2.1.0"
+                       }
+               },
+               "set-blocking": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+                       "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+                       "dev": true
+               },
+               "shallow-clone": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+                       "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+                       "dev": true,
+                       "requires": {
+                               "kind-of": "^6.0.2"
+                       }
+               },
+               "shebang-command": {
+                       "version": "2.0.0",
+                       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+                       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+                       "dev": true,
+                       "requires": {
+                               "shebang-regex": "^3.0.0"
+                       }
+               },
+               "shebang-regex": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+                       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+                       "dev": true
+               },
+               "signal-exit": {
+                       "version": "4.1.0",
+                       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+                       "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+                       "dev": true
+               },
+               "sigstore": {
+                       "version": "1.9.0",
+                       "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz",
+                       "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==",
+                       "dev": true,
+                       "requires": {
+                               "@sigstore/bundle": "^1.1.0",
+                               "@sigstore/protobuf-specs": "^0.2.0",
+                               "@sigstore/sign": "^1.0.0",
+                               "@sigstore/tuf": "^1.0.3",
+                               "make-fetch-happen": "^11.0.1"
+                       }
+               },
+               "sisteransi": {
+                       "version": "1.0.5",
+                       "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+                       "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+                       "dev": true
+               },
+               "slash": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+                       "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+                       "dev": true
+               },
+               "smart-buffer": {
+                       "version": "4.2.0",
+                       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+                       "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+                       "dev": true
+               },
+               "socks": {
+                       "version": "2.7.1",
+                       "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+                       "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+                       "dev": true,
+                       "requires": {
+                               "ip": "^2.0.0",
+                               "smart-buffer": "^4.2.0"
+                       }
+               },
+               "socks-proxy-agent": {
+                       "version": "7.0.0",
+                       "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
+                       "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
+                       "dev": true,
+                       "requires": {
+                               "agent-base": "^6.0.2",
+                               "debug": "^4.3.3",
+                               "socks": "^2.6.2"
+                       }
+               },
+               "source-map": {
+                       "version": "0.6.1",
+                       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+                       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+                       "dev": true
+               },
+               "source-map-js": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+                       "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+                       "dev": true
+               },
+               "source-map-support": {
+                       "version": "0.5.21",
+                       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+                       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+                       "dev": true,
+                       "requires": {
+                               "buffer-from": "^1.0.0",
+                               "source-map": "^0.6.0"
+                       }
+               },
+               "spawn-please": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz",
+                       "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==",
+                       "dev": true,
+                       "requires": {
+                               "cross-spawn": "^7.0.3"
+                       }
+               },
+               "spdx-correct": {
+                       "version": "3.2.0",
+                       "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+                       "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+                       "dev": true,
+                       "requires": {
+                               "spdx-expression-parse": "^3.0.0",
+                               "spdx-license-ids": "^3.0.0"
+                       }
+               },
+               "spdx-exceptions": {
+                       "version": "2.3.0",
+                       "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+                       "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+                       "dev": true
+               },
+               "spdx-expression-parse": {
+                       "version": "3.0.1",
+                       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+                       "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+                       "dev": true,
+                       "requires": {
+                               "spdx-exceptions": "^2.1.0",
+                               "spdx-license-ids": "^3.0.0"
+                       }
+               },
+               "spdx-license-ids": {
+                       "version": "3.0.16",
+                       "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
+                       "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+                       "dev": true
+               },
+               "ssri": {
+                       "version": "10.0.5",
+                       "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz",
+                       "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==",
+                       "dev": true,
+                       "requires": {
+                               "minipass": "^7.0.3"
+                       },
+                       "dependencies": {
+                               "minipass": {
+                                       "version": "7.0.4",
+                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
+                                       "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "string_decoder": {
+                       "version": "1.3.0",
+                       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+                       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+                       "dev": true,
+                       "requires": {
+                               "safe-buffer": "~5.2.0"
+                       }
+               },
+               "string-width": {
+                       "version": "4.2.3",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+                       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+                       "dev": true,
+                       "requires": {
+                               "emoji-regex": "^8.0.0",
+                               "is-fullwidth-code-point": "^3.0.0",
+                               "strip-ansi": "^6.0.1"
+                       },
+                       "dependencies": {
+                               "ansi-regex": {
+                                       "version": "5.0.1",
+                                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                                       "dev": true
+                               },
+                               "strip-ansi": {
+                                       "version": "6.0.1",
+                                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                                       "dev": true,
+                                       "requires": {
+                                               "ansi-regex": "^5.0.1"
+                                       }
+                               }
+                       }
+               },
+               "string-width-cjs": {
+                       "version": "npm:string-width@4.2.3",
+                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+                       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+                       "dev": true,
+                       "requires": {
+                               "emoji-regex": "^8.0.0",
+                               "is-fullwidth-code-point": "^3.0.0",
+                               "strip-ansi": "^6.0.1"
+                       },
+                       "dependencies": {
+                               "ansi-regex": {
+                                       "version": "5.0.1",
+                                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                                       "dev": true
+                               },
+                               "strip-ansi": {
+                                       "version": "6.0.1",
+                                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                                       "dev": true,
+                                       "requires": {
+                                               "ansi-regex": "^5.0.1"
+                                       }
+                               }
+                       }
+               },
+               "strip-ansi": {
+                       "version": "7.1.0",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+                       "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+                       "dev": true,
+                       "requires": {
+                               "ansi-regex": "^6.0.1"
+                       }
+               },
+               "strip-ansi-cjs": {
+                       "version": "npm:strip-ansi@6.0.1",
+                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                       "dev": true,
+                       "requires": {
+                               "ansi-regex": "^5.0.1"
+                       },
+                       "dependencies": {
+                               "ansi-regex": {
+                                       "version": "5.0.1",
+                                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "strip-json-comments": {
+                       "version": "3.1.1",
+                       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+                       "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+                       "dev": true
+               },
+               "style-loader": {
+                       "version": "3.3.3",
+                       "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz",
+                       "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==",
+                       "dev": true,
+                       "requires": {}
+               },
+               "stylehacks": {
+                       "version": "6.0.0",
+                       "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz",
+                       "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==",
+                       "dev": true,
+                       "requires": {
+                               "browserslist": "^4.21.4",
+                               "postcss-selector-parser": "^6.0.4"
+                       }
+               },
+               "supports-color": {
+                       "version": "8.1.1",
+                       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+                       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+                       "dev": true,
+                       "requires": {
+                               "has-flag": "^4.0.0"
+                       }
+               },
+               "supports-preserve-symlinks-flag": {
+                       "version": "1.0.0",
+                       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+                       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+                       "dev": true
+               },
+               "svgo": {
+                       "version": "3.1.0",
+                       "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.1.0.tgz",
+                       "integrity": "sha512-R5SnNA89w1dYgNv570591F66v34b3eQShpIBcQtZtM5trJwm1VvxbIoMpRYY3ybTAutcKTLEmTsdnaknOHbiQA==",
+                       "dev": true,
+                       "requires": {
+                               "@trysound/sax": "0.2.0",
+                               "commander": "^7.2.0",
+                               "css-select": "^5.1.0",
+                               "css-tree": "^2.2.1",
+                               "css-what": "^6.1.0",
+                               "csso": "5.0.5",
+                               "picocolors": "^1.0.0"
+                       },
+                       "dependencies": {
+                               "commander": {
+                                       "version": "7.2.0",
+                                       "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+                                       "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+                                       "dev": true
+                               },
+                               "css-select": {
+                                       "version": "5.1.0",
+                                       "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+                                       "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "boolbase": "^1.0.0",
+                                               "css-what": "^6.1.0",
+                                               "domhandler": "^5.0.2",
+                                               "domutils": "^3.0.1",
+                                               "nth-check": "^2.0.1"
+                                       }
+                               },
+                               "dom-serializer": {
+                                       "version": "2.0.0",
+                                       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+                                       "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "domelementtype": "^2.3.0",
+                                               "domhandler": "^5.0.2",
+                                               "entities": "^4.2.0"
+                                       }
+                               },
+                               "domhandler": {
+                                       "version": "5.0.3",
+                                       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+                                       "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+                                       "dev": true,
+                                       "requires": {
+                                               "domelementtype": "^2.3.0"
+                                       }
+                               },
+                               "domutils": {
+                                       "version": "3.1.0",
+                                       "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+                                       "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "dom-serializer": "^2.0.0",
+                                               "domelementtype": "^2.3.0",
+                                               "domhandler": "^5.0.3"
+                                       }
+                               },
+                               "entities": {
+                                       "version": "4.5.0",
+                                       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+                                       "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "tapable": {
+                       "version": "2.2.1",
+                       "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+                       "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+                       "dev": true
+               },
+               "tar": {
+                       "version": "6.2.0",
+                       "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
+                       "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
+                       "dev": true,
+                       "requires": {
+                               "chownr": "^2.0.0",
+                               "fs-minipass": "^2.0.0",
+                               "minipass": "^5.0.0",
+                               "minizlib": "^2.1.1",
+                               "mkdirp": "^1.0.3",
+                               "yallist": "^4.0.0"
+                       },
+                       "dependencies": {
+                               "fs-minipass": {
+                                       "version": "2.1.0",
+                                       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+                                       "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "minipass": "^3.0.0"
+                                       },
+                                       "dependencies": {
+                                               "minipass": {
+                                                       "version": "3.3.6",
+                                                       "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+                                                       "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+                                                       "dev": true,
+                                                       "requires": {
+                                                               "yallist": "^4.0.0"
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               },
+               "terser": {
+                       "version": "5.26.0",
+                       "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
+                       "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
+                       "dev": true,
+                       "requires": {
+                               "@jridgewell/source-map": "^0.3.3",
+                               "acorn": "^8.8.2",
+                               "commander": "^2.20.0",
+                               "source-map-support": "~0.5.20"
+                       },
+                       "dependencies": {
+                               "commander": {
+                                       "version": "2.20.3",
+                                       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+                                       "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "terser-webpack-plugin": {
+                       "version": "5.3.9",
+                       "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+                       "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+                       "dev": true,
+                       "requires": {
+                               "@jridgewell/trace-mapping": "^0.3.17",
+                               "jest-worker": "^27.4.5",
+                               "schema-utils": "^3.1.1",
+                               "serialize-javascript": "^6.0.1",
+                               "terser": "^5.16.8"
+                       },
+                       "dependencies": {
+                               "ajv": {
+                                       "version": "6.12.6",
+                                       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+                                       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+                                       "dev": true,
+                                       "requires": {
+                                               "fast-deep-equal": "^3.1.1",
+                                               "fast-json-stable-stringify": "^2.0.0",
+                                               "json-schema-traverse": "^0.4.1",
+                                               "uri-js": "^4.2.2"
+                                       }
+                               },
+                               "ajv-keywords": {
+                                       "version": "3.5.2",
+                                       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+                                       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+                                       "dev": true,
+                                       "requires": {}
+                               },
+                               "jest-worker": {
+                                       "version": "27.5.1",
+                                       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+                                       "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "@types/node": "*",
+                                               "merge-stream": "^2.0.0",
+                                               "supports-color": "^8.0.0"
+                                       }
+                               },
+                               "json-schema-traverse": {
+                                       "version": "0.4.1",
+                                       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+                                       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+                                       "dev": true
+                               },
+                               "schema-utils": {
+                                       "version": "3.3.0",
+                                       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+                                       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "@types/json-schema": "^7.0.8",
+                                               "ajv": "^6.12.5",
+                                               "ajv-keywords": "^3.5.2"
+                                       }
+                               }
+                       }
+               },
+               "to-regex-range": {
+                       "version": "5.0.1",
+                       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+                       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+                       "dev": true,
+                       "requires": {
+                               "is-number": "^7.0.0"
+                       }
+               },
+               "tslib": {
+                       "version": "2.6.2",
+                       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+                       "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+                       "dev": true
+               },
+               "tuf-js": {
+                       "version": "1.1.7",
+                       "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz",
+                       "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==",
+                       "dev": true,
+                       "requires": {
+                               "@tufjs/models": "1.0.4",
+                               "debug": "^4.3.4",
+                               "make-fetch-happen": "^11.1.1"
+                       }
+               },
+               "type-fest": {
+                       "version": "2.19.0",
+                       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+                       "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+                       "dev": true
+               },
+               "typedarray-to-buffer": {
+                       "version": "3.1.5",
+                       "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+                       "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+                       "dev": true,
+                       "requires": {
+                               "is-typedarray": "^1.0.0"
+                       }
+               },
+               "uc.micro": {
+                       "version": "1.0.6",
+                       "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+                       "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+                       "dev": true
+               },
+               "underscore": {
+                       "version": "1.13.6",
+                       "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
+                       "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==",
+                       "dev": true
+               },
+               "undici-types": {
+                       "version": "5.26.5",
+                       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+                       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+                       "dev": true
+               },
+               "unique-filename": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+                       "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+                       "dev": true,
+                       "requires": {
+                               "unique-slug": "^4.0.0"
+                       }
+               },
+               "unique-slug": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+                       "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+                       "dev": true,
+                       "requires": {
+                               "imurmurhash": "^0.1.4"
+                       }
+               },
+               "unique-string": {
+                       "version": "3.0.0",
+                       "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
+                       "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
+                       "dev": true,
+                       "requires": {
+                               "crypto-random-string": "^4.0.0"
+                       }
+               },
+               "untildify": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+                       "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+                       "dev": true
+               },
+               "update-browserslist-db": {
+                       "version": "1.0.13",
+                       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+                       "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+                       "dev": true,
+                       "requires": {
+                               "escalade": "^3.1.1",
+                               "picocolors": "^1.0.0"
+                       }
+               },
+               "update-notifier": {
+                       "version": "6.0.2",
+                       "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz",
+                       "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==",
+                       "dev": true,
+                       "requires": {
+                               "boxen": "^7.0.0",
+                               "chalk": "^5.0.1",
+                               "configstore": "^6.0.0",
+                               "has-yarn": "^3.0.0",
+                               "import-lazy": "^4.0.0",
+                               "is-ci": "^3.0.1",
+                               "is-installed-globally": "^0.4.0",
+                               "is-npm": "^6.0.0",
+                               "is-yarn-global": "^0.4.0",
+                               "latest-version": "^7.0.0",
+                               "pupa": "^3.1.0",
+                               "semver": "^7.3.7",
+                               "semver-diff": "^4.0.0",
+                               "xdg-basedir": "^5.1.0"
+                       },
+                       "dependencies": {
+                               "chalk": {
+                                       "version": "5.3.0",
+                                       "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+                                       "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "uri-js": {
+                       "version": "4.4.1",
+                       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+                       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+                       "dev": true,
+                       "requires": {
+                               "punycode": "^2.1.0"
+                       }
+               },
+               "util-deprecate": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+                       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+                       "dev": true
+               },
+               "utila": {
+                       "version": "0.4.0",
+                       "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+                       "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+                       "dev": true
+               },
+               "validate-npm-package-license": {
+                       "version": "3.0.4",
+                       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+                       "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+                       "dev": true,
+                       "requires": {
+                               "spdx-correct": "^3.0.0",
+                               "spdx-expression-parse": "^3.0.0"
+                       }
+               },
+               "validate-npm-package-name": {
+                       "version": "5.0.0",
+                       "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz",
+                       "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==",
+                       "dev": true,
+                       "requires": {
+                               "builtins": "^5.0.0"
+                       }
+               },
+               "watchpack": {
+                       "version": "2.4.0",
+                       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+                       "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+                       "dev": true,
+                       "requires": {
+                               "glob-to-regexp": "^0.4.1",
+                               "graceful-fs": "^4.1.2"
+                       }
+               },
+               "web-worker": {
+                       "version": "1.2.0",
+                       "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz",
+                       "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
+               },
+               "webpack": {
+                       "version": "5.89.0",
+                       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
+                       "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+                       "dev": true,
+                       "requires": {
+                               "@types/eslint-scope": "^3.7.3",
+                               "@types/estree": "^1.0.0",
+                               "@webassemblyjs/ast": "^1.11.5",
+                               "@webassemblyjs/wasm-edit": "^1.11.5",
+                               "@webassemblyjs/wasm-parser": "^1.11.5",
+                               "acorn": "^8.7.1",
+                               "acorn-import-assertions": "^1.9.0",
+                               "browserslist": "^4.14.5",
+                               "chrome-trace-event": "^1.0.2",
+                               "enhanced-resolve": "^5.15.0",
+                               "es-module-lexer": "^1.2.1",
+                               "eslint-scope": "5.1.1",
+                               "events": "^3.2.0",
+                               "glob-to-regexp": "^0.4.1",
+                               "graceful-fs": "^4.2.9",
+                               "json-parse-even-better-errors": "^2.3.1",
+                               "loader-runner": "^4.2.0",
+                               "mime-types": "^2.1.27",
+                               "neo-async": "^2.6.2",
+                               "schema-utils": "^3.2.0",
+                               "tapable": "^2.1.1",
+                               "terser-webpack-plugin": "^5.3.7",
+                               "watchpack": "^2.4.0",
+                               "webpack-sources": "^3.2.3"
+                       },
+                       "dependencies": {
+                               "ajv": {
+                                       "version": "6.12.6",
+                                       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+                                       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+                                       "dev": true,
+                                       "requires": {
+                                               "fast-deep-equal": "^3.1.1",
+                                               "fast-json-stable-stringify": "^2.0.0",
+                                               "json-schema-traverse": "^0.4.1",
+                                               "uri-js": "^4.2.2"
+                                       }
+                               },
+                               "ajv-keywords": {
+                                       "version": "3.5.2",
+                                       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+                                       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+                                       "dev": true,
+                                       "requires": {}
+                               },
+                               "json-parse-even-better-errors": {
+                                       "version": "2.3.1",
+                                       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+                                       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+                                       "dev": true
+                               },
+                               "json-schema-traverse": {
+                                       "version": "0.4.1",
+                                       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+                                       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+                                       "dev": true
+                               },
+                               "schema-utils": {
+                                       "version": "3.3.0",
+                                       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+                                       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+                                       "dev": true,
+                                       "requires": {
+                                               "@types/json-schema": "^7.0.8",
+                                               "ajv": "^6.12.5",
+                                               "ajv-keywords": "^3.5.2"
+                                       }
+                               }
+                       }
+               },
+               "webpack-cli": {
+                       "version": "5.1.4",
+                       "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
+                       "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
+                       "dev": true,
+                       "requires": {
+                               "@discoveryjs/json-ext": "^0.5.0",
+                               "@webpack-cli/configtest": "^2.1.1",
+                               "@webpack-cli/info": "^2.0.2",
+                               "@webpack-cli/serve": "^2.0.5",
+                               "colorette": "^2.0.14",
+                               "commander": "^10.0.1",
+                               "cross-spawn": "^7.0.3",
+                               "envinfo": "^7.7.3",
+                               "fastest-levenshtein": "^1.0.12",
+                               "import-local": "^3.0.2",
+                               "interpret": "^3.1.1",
+                               "rechoir": "^0.8.0",
+                               "webpack-merge": "^5.7.3"
+                       },
+                       "dependencies": {
+                               "commander": {
+                                       "version": "10.0.1",
+                                       "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+                                       "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "webpack-merge": {
+                       "version": "5.10.0",
+                       "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+                       "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+                       "dev": true,
+                       "requires": {
+                               "clone-deep": "^4.0.1",
+                               "flat": "^5.0.2",
+                               "wildcard": "^2.0.0"
+                       }
+               },
+               "webpack-sources": {
+                       "version": "3.2.3",
+                       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+                       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+                       "dev": true
+               },
+               "which": {
+                       "version": "2.0.2",
+                       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+                       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+                       "dev": true,
+                       "requires": {
+                               "isexe": "^2.0.0"
+                       }
+               },
+               "wide-align": {
+                       "version": "1.1.5",
+                       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+                       "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+                       "dev": true,
+                       "requires": {
+                               "string-width": "^1.0.2 || 2 || 3 || 4"
+                       }
+               },
+               "widest-line": {
+                       "version": "4.0.1",
+                       "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
+                       "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
+                       "dev": true,
+                       "requires": {
+                               "string-width": "^5.0.1"
+                       },
+                       "dependencies": {
+                               "emoji-regex": {
+                                       "version": "9.2.2",
+                                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                                       "dev": true
+                               },
+                               "string-width": {
+                                       "version": "5.1.2",
+                                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "eastasianwidth": "^0.2.0",
+                                               "emoji-regex": "^9.2.2",
+                                               "strip-ansi": "^7.0.1"
+                                       }
+                               }
+                       }
+               },
+               "wildcard": {
+                       "version": "2.0.1",
+                       "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+                       "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+                       "dev": true
+               },
+               "wrap-ansi": {
+                       "version": "8.1.0",
+                       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+                       "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+                       "dev": true,
+                       "requires": {
+                               "ansi-styles": "^6.1.0",
+                               "string-width": "^5.0.1",
+                               "strip-ansi": "^7.0.1"
+                       },
+                       "dependencies": {
+                               "ansi-styles": {
+                                       "version": "6.2.1",
+                                       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+                                       "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+                                       "dev": true
+                               },
+                               "emoji-regex": {
+                                       "version": "9.2.2",
+                                       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+                                       "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+                                       "dev": true
+                               },
+                               "string-width": {
+                                       "version": "5.1.2",
+                                       "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+                                       "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+                                       "dev": true,
+                                       "requires": {
+                                               "eastasianwidth": "^0.2.0",
+                                               "emoji-regex": "^9.2.2",
+                                               "strip-ansi": "^7.0.1"
+                                       }
+                               }
+                       }
+               },
+               "wrap-ansi-cjs": {
+                       "version": "npm:wrap-ansi@7.0.0",
+                       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+                       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+                       "dev": true,
+                       "requires": {
+                               "ansi-styles": "^4.0.0",
+                               "string-width": "^4.1.0",
+                               "strip-ansi": "^6.0.0"
+                       },
+                       "dependencies": {
+                               "ansi-regex": {
+                                       "version": "5.0.1",
+                                       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+                                       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+                                       "dev": true
+                               },
+                               "strip-ansi": {
+                                       "version": "6.0.1",
+                                       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+                                       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+                                       "dev": true,
+                                       "requires": {
+                                               "ansi-regex": "^5.0.1"
+                                       }
+                               }
+                       }
+               },
+               "wrappy": {
+                       "version": "1.0.2",
+                       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+                       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+                       "dev": true
+               },
+               "write-file-atomic": {
+                       "version": "3.0.3",
+                       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+                       "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+                       "dev": true,
+                       "requires": {
+                               "imurmurhash": "^0.1.4",
+                               "is-typedarray": "^1.0.0",
+                               "signal-exit": "^3.0.2",
+                               "typedarray-to-buffer": "^3.1.5"
+                       },
+                       "dependencies": {
+                               "signal-exit": {
+                                       "version": "3.0.7",
+                                       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+                                       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+                                       "dev": true
+                               }
+                       }
+               },
+               "xdg-basedir": {
+                       "version": "5.1.0",
+                       "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
+                       "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
+                       "dev": true
+               },
+               "xml-utils": {
+                       "version": "1.7.0",
+                       "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.7.0.tgz",
+                       "integrity": "sha512-bWB489+RQQclC7A9OW8e5BzbT8Tu//jtAOvkYwewFr+Q9T9KDGvfzC1lp0pYPEQPEoPQLDkmxkepSC/2gIAZGw=="
+               },
+               "xmlcreate": {
+                       "version": "2.0.4",
+                       "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz",
+                       "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
+                       "dev": true
+               },
+               "yallist": {
+                       "version": "4.0.0",
+                       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+                       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+                       "dev": true
+               },
+               "yocto-queue": {
+                       "version": "0.1.0",
+                       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+                       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+                       "dev": true
+               },
+               "zstddec": {
+                       "version": "0.1.0",
+                       "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz",
+                       "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg=="
+               }
+       }
+}
diff --git a/js/package.json b/js/package.json
new file mode 100644 (file)
index 0000000..4cef5e9
--- /dev/null
@@ -0,0 +1,31 @@
+{
+       "name": "org.argeo.app.js",
+       "version": "2.3.0.next",
+       "description": "",
+       "private": "true",
+       "scripts": {
+               "build": "webpack --config webpack.dev.js",
+               "build-prod": "webpack --config webpack.prod.js"
+       },
+       "keywords": [],
+       "author": "",
+       "license": "GPL",
+       "devDependencies": {
+               "css-loader": "^6.8.1",
+               "css-minimizer-webpack-plugin": "^5.0.1",
+               "html-webpack-plugin": "^5.5.3",
+               "jsdoc": "^4.0.2",
+               "mini-css-extract-plugin": "^2.7.6",
+               "npm-check-updates": "^16.13.2",
+               "style-loader": "^3.3.3",
+               "webpack": "^5.83.1",
+               "webpack-cli": "^5.1.1",
+               "webpack-merge": "^5.9.0"
+       },
+       "dependencies": {
+               "@nieuwlandgeo/sldreader": "0.3.x",
+               "chart.js": "4.x.x",
+               "chartjs-plugin-annotation": "^3.0.1",
+               "ol": "8.x.x"
+       }
+}
diff --git a/js/src/chart/BarChart.js b/js/src/chart/BarChart.js
new file mode 100644 (file)
index 0000000..d65b9cc
--- /dev/null
@@ -0,0 +1,27 @@
+import Chart from 'chart.js/auto';
+
+import ChartJsPart from './ChartJsPart.js';
+
+export default class BarChart extends ChartJsPart {
+       /** Constructor taking the mapName as an argument. */
+       constructor(chartName) {
+               super(chartName);
+               this.setChart(new Chart(this.getChartCanvas(), {
+                       type: 'bar',
+                       data: {
+                               datasets: []
+                       },
+                       options: {
+                               scales: {
+                                       y: {
+                                               beginAtZero: true
+                                       },
+                               },
+                               animation: false,
+                       }
+               }));
+
+       }
+
+
+}
diff --git a/js/src/chart/ChartJsPart.js b/js/src/chart/ChartJsPart.js
new file mode 100644 (file)
index 0000000..ac60ce3
--- /dev/null
@@ -0,0 +1,65 @@
+import ChartPart from './ChartPart.js';
+
+import { Chart } from 'chart.js';
+import annotationPlugin from 'chartjs-plugin-annotation';
+
+Chart.register(annotationPlugin);
+
+export default class ChartJsPart extends ChartPart {
+       #chart;
+
+       /** Constructor taking the mapName as an argument. */
+       constructor(chartName) {
+               super(chartName);
+       }
+
+       setChart(chart) {
+               this.#chart = chart;
+       }
+
+       getChart() {
+               return this.#chart;
+       }
+
+       //
+       // DATA
+       //
+       setLabels(labels) {
+               const chart = this.getChart();
+               chart.data.labels = labels;
+               this.update();
+       }
+
+       addDataset(label, data) {
+               const chart = this.getChart();
+               chart.data.datasets.push({
+                       label: label,
+                       data: data,
+                       borderWidth: 1
+               });
+               this.update();
+       }
+
+       setData(labels, label, data) {
+               this.clearDatasets();
+               this.setLabels(labels);
+               this.addDataset(label, data);
+       }
+
+       setDatasets(labels, datasets) {
+               const chart = this.getChart();
+               chart.data.datasets = datasets;
+               chart.data.labels = labels;
+               this.update();
+       }
+
+       clearDatasets() {
+               const chart = this.getChart();
+               chart.data.datasets = [];
+               this.update();
+       }
+
+       update() {
+               this.#chart.update();
+       }
+}
diff --git a/js/src/chart/ChartPart.js b/js/src/chart/ChartPart.js
new file mode 100644 (file)
index 0000000..1fe9221
--- /dev/null
@@ -0,0 +1,34 @@
+/** API to be used by Java.
+ *  @module MapPart
+ */
+
+/** Abstract base class for displaying a map. */
+export default class ChartPart {
+
+       /** The name of the chart, will also be the name of the variable */
+       #chartName;
+
+       constructor(chartName) {
+               this.#chartName = chartName;
+               this.createChartCanvas(this.#chartName);
+       }
+
+
+       //
+       // HTML
+       //
+       /** Create the div element where the chart will be displayed. */
+       createChartCanvas(id) {
+               const chartDiv = document.createElement('canvas');
+               chartDiv.id = id;
+               //chartDiv.style.cssText = 'width: 100%;';
+               chartDiv.style.cssText = 'width: 100%; height: 100vh;';
+               document.body.appendChild(chartDiv);
+       }
+
+       /** Get the div element where the chart is displayed. */
+       getChartCanvas() {
+               return document.getElementById(this.#chartName);
+       }
+
+}
\ No newline at end of file
diff --git a/js/src/chart/TestGraph.js b/js/src/chart/TestGraph.js
new file mode 100644 (file)
index 0000000..9cc67db
--- /dev/null
@@ -0,0 +1,27 @@
+import Chart from 'chart.js/auto';
+
+export default class TestGraph {
+
+       init() {
+               const ctx = document.getElementById('myChart');
+
+               new Chart(ctx, {
+                       type: 'bar',
+                       data: {
+                               labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
+                               datasets: [{
+                                       label: '# of Votes',
+                                       data: [12, 19, 3, 5, 2, 3],
+                                       borderWidth: 1
+                               }]
+                       },
+                       options: {
+                               scales: {
+                                       y: {
+                                               beginAtZero: true
+                                       }
+                               }
+                       }
+               });
+       }
+}
diff --git a/js/src/chart/export-package.js b/js/src/chart/export-package.js
new file mode 100644 (file)
index 0000000..5fbcc0a
--- /dev/null
@@ -0,0 +1,21 @@
+import BarChart from './BarChart.js';
+import TestGraph from './TestGraph.js';
+//import { rectY, binX } from "@observablehq/plot";
+
+// PSEUDO PACKAGE
+if (typeof globalThis.argeo === 'undefined')
+       globalThis.argeo = {};
+if (typeof globalThis.argeo.app === 'undefined')
+       globalThis.argeo.app = {};
+if (typeof globalThis.argeo.app.chart === 'undefined')
+       globalThis.argeo.app.chart = {};
+
+// PUBLIC CLASSES
+globalThis.argeo.app.chart.BarChart = BarChart;
+globalThis.argeo.app.chart.TestGraph = TestGraph;
+
+//const plot = rectY({ length: 10000 }, binX({ y: "count" }, { x: Math.random })).plot();
+//const div = document.querySelector("#myplot");
+//div.append(plot);
+
+"use strict";
diff --git a/js/src/chart/index.html b/js/src/chart/index.html
new file mode 100644 (file)
index 0000000..72f6094
--- /dev/null
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+       <meta charset="UTF-8">
+</head>
+
+<body>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/js/src/chart/index.js b/js/src/chart/index.js
new file mode 100644 (file)
index 0000000..6ff32b0
--- /dev/null
@@ -0,0 +1 @@
+import './export-package.js';
diff --git a/js/src/geo/BboxVectorSource.js b/js/src/geo/BboxVectorSource.js
new file mode 100644 (file)
index 0000000..e1051b0
--- /dev/null
@@ -0,0 +1,25 @@
+
+import VectorSource from 'ol/source/Vector.js';
+import { bbox } from 'ol/loadingstrategy';
+import { transformToEpsg4326LatLonExtent } from './OpenLayersUtils.js';
+
+export default class BboxVectorSource extends VectorSource {
+       constructor(options) {
+               super(BboxVectorSource.processOptions(options));
+       }
+
+       static processOptions(options) {
+               options.strategy = bbox;
+               options.url = function(extent, resolution, projection) {
+                       var bbox = transformToEpsg4326LatLonExtent(extent, projection);
+
+                       const baseUrl = options.baseUrl;
+                       // invert bbox order in order to have minLat,minLon,maxLat,maxLon as required by WFS 2.0.0
+                       const url = baseUrl + '&bbox=' + bbox.join(',') + ',EPSG:4326';
+                       return url;
+               }
+               return options;
+       }
+
+
+}
\ No newline at end of file
diff --git a/js/src/geo/MapPart.js b/js/src/geo/MapPart.js
new file mode 100644 (file)
index 0000000..b7fd086
--- /dev/null
@@ -0,0 +1,62 @@
+/** API to be used by Java.
+ *  @module MapPart
+ */
+
+/** Abstract base class for displaying a map. */
+export default class MapPart {
+
+       /** The name of the map, will also be the name of the variable */
+       #mapName;
+
+       constructor(mapName) {
+               this.#mapName = mapName;
+               this.createMapDiv(this.#mapName);
+       }
+
+       //
+       // ABSTRACT METHODS
+       //
+       /** Set the center of the map to the given coordinates. */
+       setCenter(lng, lat) {
+               throw new Error("Abstract method");
+       }
+
+       //
+       // EXTENSIONS
+       //
+       loadMapModule(url) {
+               var script = document.createElement("script");
+               script.src = url;
+               document.head.appendChild(script);
+               //              import(url)
+               //                      .then(module => { })
+               //                      .catch((error) => 'An error occurred while loading the component');
+       }
+
+       //
+       // ACCESSORS
+       //
+       getMapName() {
+               return this.#mapName;
+       }
+
+       //
+       // HTML
+       //
+       createMapDiv(id) {
+               var mapDiv = document.createElement('div');
+               mapDiv.id = id;
+               mapDiv.className = this.getMapDivCssClass();
+               mapDiv.style.cssText = 'width: 100%; height: 100vh;';
+               document.body.appendChild(mapDiv);
+       }
+
+       getMapDivCssClass() {
+               throw new Error("Abstract method");
+       }
+
+       newObject(js) {
+               const func = new Function(js);
+               return (func());
+       }
+}
diff --git a/js/src/geo/OpenLayersMapPart.js b/js/src/geo/OpenLayersMapPart.js
new file mode 100644 (file)
index 0000000..d033e30
--- /dev/null
@@ -0,0 +1,303 @@
+/** OpenLayers-based implementation. 
+ * @module OpenLayersMapPart
+ */
+
+import { fromLonLat, getPointResolution } from 'ol/proj.js';
+
+import TileLayer from 'ol/layer/Tile.js';
+
+import OSM from 'ol/source/OSM.js';
+import { isEmpty } from 'ol/extent';
+
+import Select from 'ol/interaction/Select.js';
+import Overlay from 'ol/Overlay.js';
+
+import Map from 'ol/Map.js';
+
+import { OverviewMap, ScaleLine, defaults as defaultControls } from 'ol/control.js';
+import { easeOut } from 'ol/easing';
+
+import * as SLDReader from '@nieuwlandgeo/sldreader';
+
+import MapPart from './MapPart.js';
+import { transformToOlLonLatExtent } from './OpenLayersUtils.js';
+
+/** OpenLayers implementation of MapPart. */
+export default class OpenLayersMapPart extends MapPart {
+       /** The OpenLayers Map. */
+       #map;
+
+       /** The overview map */
+       #overviewMap;
+
+       /** Styled layer descriptor */
+       #sld;
+
+       /** The select interaction */
+       select;
+
+       /** Externally added callback functions. */
+       callbacks = {};
+
+       /** Constructor taking the mapName as an argument. */
+       constructor(mapName) {
+               super(mapName);
+               this.#overviewMap = new OverviewMap({
+                       layers: [
+                               new TileLayer({
+                                       source: new OSM(),
+                               }),
+                       ],
+               });
+               this.select = new Select();
+               this.#map = new Map({
+                       controls: defaultControls({
+                               attribution: false,
+                               rotate: false,
+                       }).extend([this.#overviewMap, new ScaleLine({
+                               bar: false,
+                               steps: 2,
+                               text: false,
+                               minWidth: 150,
+                               maxWidth: 200,
+                       })]),
+                       layers: [
+                       ],
+                       //                                              view: new View({
+                       //                                                      projection: 'EPSG:4326',
+                       //                                                      center: [0, 0],
+                       //                                                      zoom: 2,
+                       //                                              }),
+                       target: this.getMapName(),
+               });
+               this.#map.addInteraction(this.select);
+               //this.#map.getView().set('projection', 'EPSG:4326', true);
+       }
+
+       /* GEOGRAPHICAL METHODS */
+
+       setCenter(lat, lon) {
+               this.#map.getView().setCenter(fromLonLat([lon, lat]));
+       }
+
+       fit(extent, options) {
+               var transformed = transformToOlLonLatExtent(extent, this.#map.getView().getProjection());
+               this.#map.getView().fit(transformed, options);
+       }
+
+       /** Accessors */
+       getMap() {
+               return this.#map;
+       }
+
+       getLayerByName(name) {
+               let layers = this.#map.getLayers();
+               for (let i = 0; i < layers.getLength(); i++) {
+                       let layer = layers.item(i);
+                       let n = layer.get('name');
+                       if (n !== undefined) {
+                               if (name === n)
+                                       return layer;
+                       }
+               }
+               return undefined;
+       }
+
+       /* CALLBACKS */
+       enableFeatureSingleClick() {
+               // we cannot use 'this' in the function provided to OpenLayers
+               let mapPart = this;
+               this.#map.on('singleclick', function(e) {
+                       let feature = null;
+                       // we chose the first one
+                       e.map.forEachFeatureAtPixel(e.pixel, function(f) {
+                               feature = f;
+                               return true;
+                       });
+                       if (feature !== null)
+                               mapPart.callbacks['onFeatureSingleClick'](feature.get('cr:path'));
+               });
+       }
+
+       enableFeatureSelected() {
+               // we cannot use 'this' in the function provided to OpenLayers
+               let mapPart = this;
+               var select = new Select();
+               this.#map.addInteraction(select);
+               select.on('select', function(e) {
+                       if (e.selected.length > 0) {
+                               let feature = e.selected[0];
+                               mapPart.callbacks['onFeatureSelected'](feature.get('cr:path'));
+                       }
+               });
+       }
+
+       enableFeaturePopup() {
+               // we cannot use 'this' in the function provided to OpenLayers
+               let mapPart = this;
+               /**
+                * Elements that make up the popup.
+                */
+               const container = document.getElementById('popup');
+               const content = document.getElementById('popup-content');
+               const closer = document.getElementById('popup-closer');
+
+               /**
+                * Create an overlay to anchor the popup to the map.
+                */
+               const overlay = new Overlay({
+                       element: container,
+                       autoPan: false,
+                       autoPanAnimation: {
+                               duration: 250,
+                       },
+               });
+               this.#map.addOverlay(overlay);
+
+               let selected = null;
+               this.#map.on('pointermove', function(e) {
+                       if (selected !== null) {
+                               selected.setStyle(undefined);
+                               selected = null;
+                       }
+
+                       e.map.forEachFeatureAtPixel(e.pixel, function(f) {
+                               selected = f;
+                               return true;
+                       });
+
+                       if (selected == null) {
+                               overlay.setPosition(undefined);
+                               return;
+                       }
+                       const coordinate = e.coordinate;
+                       const path = selected.get('cr:path');
+                       if (path === null)
+                               return true;
+                       const res = mapPart.callbacks['onFeaturePopup'](path);
+                       if (res != null) {
+                               content.innerHTML = res;
+                               overlay.setPosition(coordinate);
+                       } else {
+                               overlay.setPosition(undefined);
+                       }
+               });
+       }
+
+       selectFeatures(layerName, featureIds) {
+               // we cannot use 'this' in the function provided to OpenLayers
+               let mapPart = this;
+               this.select.getFeatures().clear();
+               const layer = this.getLayerByName(layerName);
+               const source = layer.getSource();
+               for (const featureId of featureIds) {
+                       let feature = source.getFeatureById(featureId);
+                       if (feature === null) {
+                               source.on('featuresloadend', function(e) {
+                                       feature = source.getFeatureById(featureId);
+                                       if (feature !== null)
+                                               mapPart.select.getFeatures().push(feature);
+                               });
+                       } else {
+                               this.select.getFeatures().push(feature);
+                       }
+               }
+       }
+
+       fitToLayer(layerName) {
+               // we cannot use 'this' in the function provided to OpenLayers
+               let mapPart = this;
+               const layer = this.getLayerByName(layerName);
+               const source = layer.getSource();
+               const extent = source.getExtent();
+               const options = {
+                       duration: 1000,
+                       padding: [20, 20, 20, 20],
+                       easing: easeOut,
+               };
+               if (!isEmpty(extent))
+                       this.#map.getView().fit(source.getExtent(), options);
+               source.on('featuresloadend', function(e) {
+                       mapPart.getMap().getView().fit(source.getExtent(), options);
+               });
+       }
+
+       //
+       // HTML
+       //
+       getMapDivCssClass() {
+               return 'map';
+       }
+
+
+       //
+       // STATIC FOR EXTENSION
+       //
+       static newStyle(args) {
+               return new Style(args);
+       }
+
+       static newIcon(args) {
+               return new Icon(args);
+       }
+
+       //
+       // SLD STYLING
+       //
+
+       setSld(xml) {
+               this.#sld = SLDReader.Reader(xml);
+       }
+
+       /** Get a FeatureTypeStyle (https://nieuwlandgeo.github.io/SLDReader/api.html#FeatureTypeStyle).  */
+       getFeatureTypeStyle(styledLayerName, styleName) {
+               const sldLayer = SLDReader.getLayer(this.#sld, styledLayerName);
+               const style = styleName === undefined ? SLDReader.getStyle(sldLayer) : SLDReader.getStyle(sldLayer, styleName);
+               // OpenLayers can only use one definition
+               const featureTypeStyle = style.featuretypestyles[0];
+               return featureTypeStyle;
+       }
+
+       applyStyle(layerName, styledLayerName, styleName) {
+               const layer = this.getLayerByName(layerName);
+               const featureTypeStyle = this.getFeatureTypeStyle(styledLayerName, styleName);
+               const viewProjection = this.#map.getView().getProjection();
+               const olStyleFunction = SLDReader.createOlStyleFunction(featureTypeStyle, {
+                       // Use the convertResolution option to calculate a more accurate resolution.
+                       convertResolution: viewResolution => {
+                               const viewCenter = this.#map.getView().getCenter();
+                               return getPointResolution(viewProjection, viewResolution, viewCenter);
+                       },
+                       // If you use point icons with an ExternalGraphic, you have to use imageLoadCallback
+                       // to update the vector layer when an image finishes loading.
+                       // If you do not do this, the image will only be visible after next layer pan/zoom.
+                       imageLoadedCallback: () => {
+                               layer.changed();
+                       },
+               });
+               layer.setStyle(olStyleFunction);
+       }
+
+       #applySLD(vectorLayer, text) {
+               const sldObject = SLDReader.Reader(text);
+               const sldLayer = SLDReader.getLayer(sldObject);
+               const style = SLDReader.getStyle(sldLayer);
+               const featureTypeStyle = style.featuretypestyles[0];
+
+               const viewProjection = this.#map.getView().getProjection();
+               const olStyleFunction = SLDReader.createOlStyleFunction(featureTypeStyle, {
+                       // Use the convertResolution option to calculate a more accurate resolution.
+                       convertResolution: viewResolution => {
+                               const viewCenter = this.#map.getView().getCenter();
+                               return getPointResolution(viewProjection, viewResolution, viewCenter);
+                       },
+                       // If you use point icons with an ExternalGraphic, you have to use imageLoadCallback
+                       // to update the vector layer when an image finishes loading.
+                       // If you do not do this, the image will only be visible after next layer pan/zoom.
+                       imageLoadedCallback: () => {
+                               vectorLayer.changed();
+                       },
+               });
+               vectorLayer.setStyle(olStyleFunction);
+       }
+}
diff --git a/js/src/geo/OpenLayersUtils.js b/js/src/geo/OpenLayersUtils.js
new file mode 100644 (file)
index 0000000..b85ad7d
--- /dev/null
@@ -0,0 +1,31 @@
+import { transformExtent } from 'ol/proj.js';
+
+
+export function transformToEpsg4326LatLonExtent(extent, projection) {
+       const proj = projection.getCode();
+       if (proj === 'EPSG:4326')
+               return toLatLonExtent(extent);
+       var transformed = transformExtent(extent, proj, 'EPSG:4326');
+       return toLatLonExtent(transformed);
+}
+
+/** From EPSG:4326 lat/lon to a proj lon/lat */
+export function transformToOlLonLatExtent(extent, projection) {
+       const proj = projection.getCode();
+       if (proj === 'EPSG:4326')
+               return toLonLatExtent(extent);
+       const reordered = toLonLatExtent(extent);
+       var transformed = transformExtent(reordered, 'EPSG:4326', proj);
+       return transformed;
+}
+
+/** Converts from an extent in OpenLayers order (lon/lat) to WFS 2.0 order (lat/lon). */
+export function toLatLonExtent(extent) {
+       return [extent[1], extent[0], extent[3], extent[2]];
+}
+
+/** Converts from an extent in WFS 2.0 order (lat/lon) to OpenLayers order (lon/lat) . */
+export function toLonLatExtent(extent) {
+       return [extent[1], extent[0], extent[3], extent[2]];
+}
+
diff --git a/js/src/geo/SentinelCloudless.js b/js/src/geo/SentinelCloudless.js
new file mode 100644 (file)
index 0000000..820a440
--- /dev/null
@@ -0,0 +1,54 @@
+
+import WMTS from 'ol/source/WMTS.js';
+import WMTSTileGrid from 'ol/tilegrid/WMTS';
+import { getTopLeft } from 'ol/extent';
+import { getWidth } from 'ol/extent';
+import { get as getProjection } from 'ol/proj';
+
+export default class SentinelCloudless extends WMTS {
+       static source_s2CL2019;
+       static EPSG4326 = getProjection('EPSG:4326');
+
+       static resolutions;
+       static matrixIds;
+
+       static {
+               let min_zoom = 6;
+               let max_zoom = 17;
+               let zoomOffset = 1;
+
+               // from https://s2maps.eu/
+               let size = getWidth(this.EPSG4326.getExtent()) / 512;
+               this.resolutions = new Array(max_zoom + zoomOffset);
+               this.matrixIds = new Array(max_zoom + zoomOffset);
+               for (let z = min_zoom; z <= max_zoom; ++z) {
+                       // generate resolutions and matrixIds arrays for this WMTS
+                       this.resolutions[z] = size / Math.pow(2, z);
+                       this.matrixIds[z] = z;
+               }
+       }
+       
+       constructor() {
+               super({
+                       urls: [
+                               "//a.s2maps-tiles.eu/wmts/",
+                               "//b.s2maps-tiles.eu/wmts/",
+                               "//c.s2maps-tiles.eu/wmts/",
+                               "//d.s2maps-tiles.eu/wmts/",
+                               "//e.s2maps-tiles.eu/wmts/"
+                       ],
+                       layer: 's2cloudless-2021',
+                       matrixSet: 'WGS84',
+                       format: 'image/jpeg',
+                       projection: SentinelCloudless.EPSG4326,
+                       tileGrid: new WMTSTileGrid({
+                               origin: getTopLeft(SentinelCloudless.EPSG4326.getExtent()),
+                               resolutions: SentinelCloudless.resolutions,
+                               matrixIds: SentinelCloudless.matrixIds,
+                       }),
+                       style: 'default',
+                       transition: 0,
+                       wrapX: true
+               });
+       }
+}
\ No newline at end of file
diff --git a/js/src/geo/export-package.js b/js/src/geo/export-package.js
new file mode 100644 (file)
index 0000000..50b9d04
--- /dev/null
@@ -0,0 +1,44 @@
+import OpenLayersMapPart from './OpenLayersMapPart.js';
+import BboxVectorSource from './BboxVectorSource.js';
+import SentinelCloudless from './SentinelCloudless.js';
+
+import Map from 'ol/Map.js';
+import View from 'ol/View.js';
+import OSM from 'ol/source/OSM.js';
+import TileLayer from 'ol/layer/Tile.js';
+import VectorSource from 'ol/source/Vector.js';
+import VectorLayer from 'ol/layer/Vector.js';
+import GeoJSON from 'ol/format/GeoJSON.js';
+import { Style, Icon } from 'ol/style.js';
+
+// PSEUDO PACKAGE
+if (typeof globalThis.argeo === 'undefined')
+       globalThis.argeo = {};
+if (typeof globalThis.argeo.app === 'undefined')
+       globalThis.argeo.app = {};
+if (typeof globalThis.argeo.app.geo === 'undefined')
+       globalThis.argeo.app.geo = {};
+
+// THIRD PARTY
+if (typeof globalThis.argeo.tp === 'undefined')
+       globalThis.argeo.tp = {};
+if (typeof globalThis.argeo.tp.ol === 'undefined')
+       globalThis.argeo.tp.ol = {};
+
+// PUBLIC CLASSES
+globalThis.argeo.app.geo.OpenLayersMapPart = OpenLayersMapPart;
+globalThis.argeo.app.geo.BboxVectorSource = BboxVectorSource;
+globalThis.argeo.app.geo.SentinelCloudless = SentinelCloudless;
+
+globalThis.argeo.tp.ol.Map = Map;
+globalThis.argeo.tp.ol.View = View;
+globalThis.argeo.tp.ol.TileLayer = TileLayer;
+globalThis.argeo.tp.ol.OSM = OSM;
+globalThis.argeo.tp.ol.VectorSource = VectorSource;
+globalThis.argeo.tp.ol.VectorLayer = VectorLayer;
+globalThis.argeo.tp.ol.GeoJSON = GeoJSON;
+globalThis.argeo.tp.ol.Style = Style;
+globalThis.argeo.tp.ol.Icon = Icon;
+
+"use strict";
+
diff --git a/js/src/geo/index.html b/js/src/geo/index.html
new file mode 100644 (file)
index 0000000..bfc2233
--- /dev/null
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+       <meta charset="UTF-8">
+       <style>
+               .ol-popup {
+                       position: absolute;
+                       background-color: white;
+                       box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
+                       padding: 5px;
+                       border-radius: 10px;
+                       border: 1px solid #cccccc;
+                       bottom: 12px;
+                       left: -50px;
+                       min-width: 130px;
+               }
+
+               .ol-popup:after,
+               .ol-popup:before {
+                       top: 100%;
+                       border: solid transparent;
+                       content: " ";
+                       height: 0;
+                       width: 0;
+                       position: absolute;
+                       pointer-events: none;
+               }
+
+               .ol-popup:after {
+                       border-top-color: white;
+                       border-width: 10px;
+                       left: 48px;
+                       margin-left: -10px;
+               }
+
+               .ol-popup:before {
+                       border-top-color: #cccccc;
+                       border-width: 11px;
+                       left: 48px;
+                       margin-left: -11px;
+               }
+
+               .ol-popup-closer {
+                       text-decoration: none;
+                       position: absolute;
+                       top: 2px;
+                       right: 8px;
+               }
+
+               .ol-popup-closer:after {
+                       content: "✖";
+               }
+
+               .map .ol-scale-line {
+                       bottom: 0px;
+                       left: 50%;
+                       margin-right: -50%;
+                       transform: translate(-50%, -50%);
+               }
+
+               .map .ol-scale-bar {
+                       bottom: 0px;
+                       left: 50%;
+                       margin-right: -50%;
+                       transform: translate(-50%, -50%);
+               }
+
+               #popup-content {
+                       font: 16px sans-serif;
+               }
+       </style>
+</head>
+
+<body>
+       <!-- Popup -->
+       <div id="popup" class="ol-popup">
+               <div id="popup-content"></div>
+       </div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/js/src/geo/index.js b/js/src/geo/index.js
new file mode 100644 (file)
index 0000000..f389db0
--- /dev/null
@@ -0,0 +1,4 @@
+import './export-package.js';
+
+// webpack specific
+import 'ol/ol.css';
diff --git a/js/webpack.common.js b/js/webpack.common.js
new file mode 100644 (file)
index 0000000..ba57965
--- /dev/null
@@ -0,0 +1,61 @@
+const MiniCssExtractPlugin = require('mini-css-extract-plugin');
+//const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const path = require('path');
+
+module.exports = {
+       entry: {
+               "geo": './src/geo/index.js',
+               "chart": './src/chart/index.js',
+       },
+       output: {
+               filename: '[name].[contenthash].js',
+               path: path.resolve(__dirname, 'org.argeo.app.js/org/argeo/app/js'),
+               publicPath: '/pkg/org.argeo.app.js',
+               clean: true,
+       },
+       optimization: {
+               moduleIds: 'deterministic',
+               runtimeChunk: 'single',
+               // split code
+               splitChunks: {
+                       chunks: 'all',
+               },
+               //              minimizer: [
+               //                      // For webpack@5 you can use the `...` syntax to extend existing minimizers (i.e. `terser-webpack-plugin`), uncomment the next line
+               //                      `...`,
+               //                      new CssMinimizerPlugin(),
+               //              ],
+       },
+       module: {
+               rules: [
+                       {
+                               test: /\.(css)$/,
+                               use: [
+                                       MiniCssExtractPlugin.loader,
+                                       'css-loader',
+                               ],
+                       },
+               ],
+       },
+       plugins: [
+               // deal with CSS
+               new MiniCssExtractPlugin(),
+               // deal with HTML generation
+               new HtmlWebpackPlugin({
+                       title: 'Argeo Suite Geo JS',
+                       template: 'src/geo/index.html',
+                       scriptLoading: 'module',
+                       filename: 'geo.html',
+                       chunks: ['geo'],
+               }),
+               new HtmlWebpackPlugin({
+                       title: 'Argeo Suite Chart JS',
+                       template: 'src/chart/index.html',
+                       scriptLoading: 'module',
+                       filename: 'chart.html',
+                       chunks: ['chart'],
+               }),
+
+       ],
+};
\ No newline at end of file
diff --git a/js/webpack.dev.js b/js/webpack.dev.js
new file mode 100644 (file)
index 0000000..3d79473
--- /dev/null
@@ -0,0 +1,11 @@
+const { merge } = require('webpack-merge');
+const common = require('./webpack.common.js');
+
+module.exports = merge(common, {
+       mode: 'development',
+       //devtool: 'source-map', // original code
+       devtool: 'eval-source-map',
+       devServer: {
+               static: './dist',
+       },
+});
\ No newline at end of file
diff --git a/js/webpack.prod.js b/js/webpack.prod.js
new file mode 100644 (file)
index 0000000..adb905a
--- /dev/null
@@ -0,0 +1,7 @@
+const { merge } = require('webpack-merge');
+const common = require('./webpack.common.js');
+
+module.exports = merge(common, {
+       mode: 'production',
+       devtool: 'source-map', // original code
+});
\ No newline at end of file
diff --git a/knowledge/.gitignore b/knowledge/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/knowledge/org.argeo.support.geonames/.classpath b/knowledge/org.argeo.support.geonames/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/knowledge/org.argeo.support.geonames/.gitignore b/knowledge/org.argeo.support.geonames/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/knowledge/org.argeo.support.geonames/.project b/knowledge/org.argeo.support.geonames/.project
deleted file mode 100644 (file)
index 3c8181f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.support.geonames</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/knowledge/org.argeo.support.geonames/META-INF/.gitignore b/knowledge/org.argeo.support.geonames/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/knowledge/org.argeo.support.geonames/bnd.bnd b/knowledge/org.argeo.support.geonames/bnd.bnd
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/knowledge/org.argeo.support.geonames/build.properties b/knowledge/org.argeo.support.geonames/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/knowledge/org.argeo.support.geonames/pom.xml b/knowledge/org.argeo.support.geonames/pom.xml
deleted file mode 100644 (file)
index 7587ef3..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>knowledge</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.support.geonames</artifactId>
-       <name>Geonames support</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.cms</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/GeonamesAdm.java
deleted file mode 100644 (file)
index d578272..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-package org.argeo.support.geonames;
-
-import java.time.LocalDate;
-import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-
-/** A Geonames administrative subdivision. */
-public class GeonamesAdm {
-       private final Long geonameId;
-       private final String countryCode;
-       private final String adminCode1;
-       private final String admLevel;
-       private final Integer level;
-       private final String name;
-       private final String asciiName;
-       private final List<String> alternateNames;
-       private final Double lat;
-       private final Double lng;
-       private final LocalDate lastUpdated;
-       private final ZoneId timeZone;
-
-       private final Long[] upperLevelIds = new Long[5];
-       private final List<GeonamesAdm> upperLevels = new ArrayList<>();
-
-       private List<String> row;
-
-       /** Initialise from a row in the main Geonames table. */
-       public GeonamesAdm(List<String> row) {
-               geonameId = Long.parseLong(row.get(0));
-               admLevel = row.get(7);
-               countryCode = row.get(8);
-               adminCode1 = row.get(10);
-               if (admLevel.startsWith("ADM")) {
-                       if (admLevel.endsWith("H"))
-                               level = Integer.parseInt(admLevel.substring(3, admLevel.length() - 1));
-                       else
-                               level = Integer.parseInt(admLevel.substring(3));
-               } else if (admLevel.equals("PCLI")) {
-                       level = 0;
-               } else {
-                       throw new IllegalArgumentException("Unsupported admin level " + admLevel);
-               }
-               name = row.get(1);
-               asciiName = row.get(2);
-               alternateNames = Arrays.asList(row.get(3).split(","));
-               lat = Double.parseDouble(row.get(4));
-               lng = Double.parseDouble(row.get(5));
-               lastUpdated = LocalDate.parse(row.get(18));
-               timeZone = ZoneId.of(row.get(17));
-               // upper levels
-               if (row.get(11) != null && !row.get(11).trim().equals(""))
-                       upperLevelIds[2] = Long.parseLong(row.get(11));
-               if (row.get(12) != null && !row.get(12).trim().equals(""))
-                       upperLevelIds[3] = Long.parseLong(row.get(12));
-               if (row.get(13) != null && !row.get(13).trim().equals(""))
-                       upperLevelIds[4] = Long.parseLong(row.get(13));
-               this.row = row;
-       }
-
-       public void mapUpperLevels(Map<Long, GeonamesAdm> index) {
-               for (int i = 0; i < level; i++) {
-                       Long geonameId = upperLevelIds[i];
-                       upperLevels.add(i, index.get(geonameId));
-               }
-       }
-
-       public Long getGeonameId() {
-               return geonameId;
-       }
-
-       public Integer getLevel() {
-               return level;
-       }
-
-       public String getName() {
-               return name;
-       }
-
-       public String getName(Function<String, String> transform) {
-               if (transform != null)
-                       return transform.apply(name);
-               else
-                       return name;
-
-       }
-
-       public String getAsciiName() {
-               return asciiName;
-       }
-
-       public List<String> getAlternateNames() {
-               return alternateNames;
-       }
-
-       public Double getLat() {
-               return lat;
-       }
-
-       public Double getLng() {
-               return lng;
-       }
-
-       public String getCountryCode() {
-               return countryCode;
-       }
-
-       public String getAdmLevel() {
-               return admLevel;
-       }
-
-       public List<String> getRow() {
-               return row;
-       }
-
-       public LocalDate getLastUpdated() {
-               return lastUpdated;
-       }
-
-       public ZoneId getTimeZone() {
-               return timeZone;
-       }
-
-       public String getAdminCode1() {
-               return adminCode1;
-       }
-
-       public Long[] getUpperLevelIds() {
-               return upperLevelIds;
-       }
-
-       public List<GeonamesAdm> getUpperLevels() {
-               return upperLevels;
-       }
-
-       @Override
-       public int hashCode() {
-               return geonameId.intValue();
-       }
-
-       @Override
-       public boolean equals(Object obj) {
-               if (!(obj instanceof GeonamesAdm))
-                       return false;
-               GeonamesAdm other = (GeonamesAdm) obj;
-               return geonameId.equals(other.geonameId);
-       }
-
-       @Override
-       public String toString() {
-               return name + " (ADM" + level + " " + geonameId + ")";
-       }
-
-}
diff --git a/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/ImportGeonamesAdmin.java b/knowledge/org.argeo.support.geonames/src/org/argeo/support/geonames/ImportGeonamesAdmin.java
deleted file mode 100644 (file)
index 9af5987..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.argeo.support.geonames;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.argeo.util.CsvParser;
-import org.argeo.util.CsvWriter;
-
-/** Import GeoNames administrative division from the main table. */
-public class ImportGeonamesAdmin {
-       // private Log log = LogFactory.getLog(ImportGeonamesAdmin.class);
-       private Map<Long, GeonamesAdm> geonamesAdms = new HashMap<>();
-
-       /** Loads the data. */
-       public void parse(InputStream in) {
-               Map<String, Long> countryGeonameIds = new HashMap<>();
-               Map<String, Long> admin1GeonameIds = new HashMap<>();
-               CsvParser csvParser = new CsvParser() {
-
-                       @Override
-                       protected void processLine(Integer lineNumber, List<String> header, List<String> tokens) {
-                               if (!"A".equals(tokens.get(6)))
-                                       return;
-                               GeonamesAdm geonamesAdm = new GeonamesAdm(tokens);
-                               geonamesAdms.put(geonamesAdm.getGeonameId(), geonamesAdm);
-                               if (geonamesAdm.getAdmLevel().equals("PCLI"))
-                                       countryGeonameIds.put(geonamesAdm.getCountryCode(), geonamesAdm.getGeonameId());
-                               if (geonamesAdm.getAdmLevel().equals("ADM1"))
-                                       admin1GeonameIds.put(geonamesAdm.getAdminCode1(), geonamesAdm.getGeonameId());
-                       }
-               };
-               csvParser.setSeparator('\t');
-               csvParser.setNoHeader(true);
-               csvParser.parse(in, StandardCharsets.UTF_8);
-
-               // fill upper levels
-               for (GeonamesAdm adm : geonamesAdms.values()) {
-                       adm.getUpperLevelIds()[0] = countryGeonameIds.get(adm.getCountryCode());
-                       if (adm.getLevel() > 0)
-                               adm.getUpperLevelIds()[1] = admin1GeonameIds.get(adm.getAdminCode1());
-                       adm.mapUpperLevels(geonamesAdms);
-               }
-
-       }
-
-       public Map<Long, GeonamesAdm> getGeonamesAdms() {
-               return geonamesAdms;
-       }
-
-       /**
-        * Copies only the Geonames of feature class 'A' (administrative subdivisions).
-        */
-       public static void filterGeonamesAdm(InputStream in, OutputStream out) {
-               CsvWriter csvWriter = new CsvWriter(out, StandardCharsets.UTF_8);
-               csvWriter.setSeparator('\t');
-               CsvParser csvParser = new CsvParser() {
-
-                       @Override
-                       protected void processLine(Integer lineNumber, List<String> header, List<String> tokens) {
-                               if (tokens.size() < 7 || !"A".equals(tokens.get(6)))
-                                       return;
-                               csvWriter.writeLine(tokens);
-                       }
-               };
-               csvParser.setSeparator('\t');
-               csvParser.setNoHeader(true);
-               csvParser.parse(in, StandardCharsets.UTF_8);
-       }
-
-       public static void main(String[] args) throws IOException {
-//             String country = "allCountries";
-               String country = "CI";
-//             try (InputStream in = Files
-//                             .newInputStream(Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + ".txt"));
-//                             OutputStream out = Files.newOutputStream(
-//                                             Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) {
-//                     ImportGeonamesAdmin.filterGeonamesAdm(in, out);
-//             }
-               try (InputStream in = Files.newInputStream(
-                               Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) {
-                       ImportGeonamesAdmin importGeonamesAdmin = new ImportGeonamesAdmin();
-                       importGeonamesAdmin.parse(in);
-               }
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/.classpath b/knowledge/org.argeo.support.odk/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/knowledge/org.argeo.support.odk/.gitignore b/knowledge/org.argeo.support.odk/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/knowledge/org.argeo.support.odk/.project b/knowledge/org.argeo.support.odk/.project
deleted file mode 100644 (file)
index ac46107..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.support.odk</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/knowledge/org.argeo.support.odk/META-INF/.gitignore b/knowledge/org.argeo.support.odk/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/knowledge/org.argeo.support.odk/OSGI-INF/odkFormListServlet.xml b/knowledge/org.argeo.support.odk/OSGI-INF/odkFormListServlet.xml
deleted file mode 100644 (file)
index 937b474..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Form List Servlet">
-   <implementation class="org.argeo.support.odk.servlet.OdkFormListServlet"/>
-   <service>
-      <provide interface="javax.servlet.Servlet"/>
-   </service>
-   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/formList/*"/>
-   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
-   <reference bind="addForm" cardinality="0..n" interface="org.argeo.support.odk.OdkForm" name="OdkForm" policy="dynamic" unbind="removeForm"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=odk)"/>
-</scr:component>
diff --git a/knowledge/org.argeo.support.odk/OSGI-INF/odkFormServlet.xml b/knowledge/org.argeo.support.odk/OSGI-INF/odkFormServlet.xml
deleted file mode 100644 (file)
index 7f7e4db..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Form Servlet">
-   <implementation class="org.argeo.support.odk.servlet.OdkFormServlet"/>
-   <service>
-      <provide interface="javax.servlet.Servlet"/>
-   </service>
-   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/form/*"/>
-   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
-   <reference bind="addForm" cardinality="0..n" interface="org.argeo.support.odk.OdkForm" name="OdkForm" policy="dynamic" unbind="removeForm"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=odk)"/>
-</scr:component>
diff --git a/knowledge/org.argeo.support.odk/OSGI-INF/odkManifestServlet.xml b/knowledge/org.argeo.support.odk/OSGI-INF/odkManifestServlet.xml
deleted file mode 100644 (file)
index cfc56ef..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Manifest Servlet">
-   <implementation class="org.argeo.support.odk.servlet.OdkManifestServlet"/>
-   <service>
-      <provide interface="javax.servlet.Servlet"/>
-   </service>
-   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/formManifest/*"/>
-   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=odk)"/>
-</scr:component>
diff --git a/knowledge/org.argeo.support.odk/OSGI-INF/odkServletContext.xml b/knowledge/org.argeo.support.odk/OSGI-INF/odkServletContext.xml
deleted file mode 100644 (file)
index 78b5b66..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="ODK Servlet Context">
-   <implementation class="org.argeo.support.odk.servlet.OdkServletContext"/>
-   <service>
-      <provide interface="org.osgi.service.http.context.ServletContextHelper"/>
-   </service>
-   <property name="osgi.http.whiteboard.context.name" type="String" value="odkServletContext"/>
-   <property name="osgi.http.whiteboard.context.path" type="String" value="/api/odk"/>
-</scr:component>
diff --git a/knowledge/org.argeo.support.odk/OSGI-INF/odkSubmissionServlet.xml b/knowledge/org.argeo.support.odk/OSGI-INF/odkSubmissionServlet.xml
deleted file mode 100644 (file)
index bce66c4..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Submission Servlet">
-   <implementation class="org.argeo.support.odk.servlet.OdkSubmissionServlet"/>
-   <service>
-      <provide interface="javax.servlet.Servlet"/>
-   </service>
-   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/submission"/>
-   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
-   <property name="osgi.http.whiteboard.servlet.multipart.enabled" type="String" value="true"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=odk)"/>
-   <reference bind="addSubmissionListener" cardinality="0..n" interface="org.argeo.support.xforms.FormSubmissionListener" name="FormSubmissionListener" policy="dynamic" unbind="removeSubmissionListener"/>
-</scr:component>
diff --git a/knowledge/org.argeo.support.odk/bnd.bnd b/knowledge/org.argeo.support.odk/bnd.bnd
deleted file mode 100644 (file)
index fa581ce..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-Require-Capability:\
-cms.datamodel;filter:="(name=entity)",\
-cms.datamodel;filter:="(name=xforms)"
-
-Provide-Capability:\
-cms.datamodel; name=odk; cnd=/org/argeo/support/odk/odk.cnd
-
-Service-Component:\
-OSGI-INF/odkServletContext.xml,\
-OSGI-INF/odkFormListServlet.xml,\
-OSGI-INF/odkFormServlet.xml,\
-OSGI-INF/odkSubmissionServlet.xml,\
-OSGI-INF/odkManifestServlet.xml
-
-Import-Package:\
-org.osgi.service.http.context,\
-org.argeo.api,\
-javax.jcr.nodetype,\
-*
diff --git a/knowledge/org.argeo.support.odk/build.properties b/knowledge/org.argeo.support.odk/build.properties
deleted file mode 100644 (file)
index 1cdf3dd..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/,\
-               OSGI-INF/odkServletContext.xml
-source.. = src/
diff --git a/knowledge/org.argeo.support.odk/pom.xml b/knowledge/org.argeo.support.odk/pom.xml
deleted file mode 100644 (file)
index 2b68347..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>knowledge</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.support.odk</artifactId>
-       <name>ODK support</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.core</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.support.xforms</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/BundleResourceOdkForm.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/BundleResourceOdkForm.java
deleted file mode 100644 (file)
index fc55f35..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.argeo.support.odk;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Map;
-
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.io.IOUtils;
-import org.argeo.util.DigestUtils;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-
-/** {@link OdkForm} implementation based on an OSGi {@link Bundle} resource. */
-public class BundleResourceOdkForm implements OdkForm {
-       private String formId;
-       private String name;
-       private String version;
-       private String description;
-       private String hash;
-       private String fileName;
-
-       private byte[] data;
-
-       public void init(Map<String, String> properties, BundleContext bundleContext) throws IOException {
-               String location = properties.get("location");
-               fileName = FilenameUtils.getName(location);
-               URL url = bundleContext.getBundle().getResource(location);
-               data = IOUtils.toByteArray(url.openStream());
-               hash = "md5:" + DigestUtils.digest(DigestUtils.MD5, data);
-
-               // TODO get it from the XML
-               formId = properties.get("formId");
-               version = properties.get("version");
-
-               name = properties.get("name");
-               description = properties.get("description");
-       }
-
-       @Override
-       public String getFormId() {
-               return formId;
-       }
-
-       @Override
-       public String getName() {
-               return name;
-       }
-
-       @Override
-       public String getVersion() {
-               return version;
-       }
-
-       @Override
-       public String getDescription() {
-               return description;
-       }
-
-       @Override
-       public String getHash(String hashType) {
-               return hash;
-       }
-
-       @Override
-       public String getFileName() {
-               return fileName;
-       }
-
-       @Override
-       public InputStream openStream() {
-               return new ByteArrayInputStream(data);
-       }
-
-       @Override
-       public int hashCode() {
-               assert formId != null;
-               assert version != null;
-               return formId.hashCode() + version.hashCode();
-       }
-
-       @Override
-       public boolean equals(Object obj) {
-               assert formId != null;
-               assert version != null;
-               if (!(obj instanceof OdkForm))
-                       return false;
-               OdkForm other = (OdkForm) obj;
-               assert other.getFormId() != null;
-               assert other.getVersion() != null;
-
-               return other.getFormId().equals(formId) && other.getVersion().equals(version);
-       }
-
-       @Override
-       public String toString() {
-               return "ODK Form " + formId + ", v" + version;
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkForm.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkForm.java
deleted file mode 100644 (file)
index 7b79a13..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.argeo.support.odk;
-
-import java.io.InputStream;
-
-/** Abstraction of a single ODK form. */
-public interface OdkForm {
-       String getFormId();
-
-       String getName();
-
-       String getVersion();
-
-       String getDescription();
-
-       String getHash(String hashType);
-
-       String getFileName();
-
-       InputStream openStream();
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkNames.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkNames.java
deleted file mode 100644 (file)
index fbb2087..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.argeo.support.odk;
-
-/** Names related to ODK. */
-public interface OdkNames {
-
-       public final static String H_HTML = "h:html";
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkUtils.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OdkUtils.java
deleted file mode 100644 (file)
index 0e73295..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-package org.argeo.support.odk;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import javax.jcr.ImportUUIDBehavior;
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.jcr.JcrxApi;
-import org.argeo.util.DigestUtils;
-
-/** Utilities around ODK. */
-public class OdkUtils {
-       private final static Log log = LogFactory.getLog(OdkUtils.class);
-
-       public static void loadOdkForm(Node formBase, String name, InputStream in) throws RepositoryException, IOException {
-               if (!formBase.isNodeType(EntityType.formSet.get()))
-                       throw new IllegalArgumentException(
-                                       "Parent path " + formBase + " must be of type " + EntityType.formSet.get());
-               Node form = JcrUtils.getOrAdd(formBase, name, OrxListName.xform.get(), NodeType.MIX_VERSIONABLE);
-
-               String previousCsum = JcrxApi.getChecksum(form, JcrxApi.MD5);
-               String previousFormId = Jcr.get(form, OrxListName.formID.get());
-               String previousFormVersion = Jcr.get(form, OrxListName.version.get());
-
-               Session s = formBase.getSession();
-//             String res = "/odk/apafSession.odk.xml";
-//             try (InputStream in = getClass().getClassLoader().getResourceAsStream(res)) {
-               s.importXML(form.getPath(), in, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
-//             }
-
-               // manage instances
-               // NodeIterator instances =
-               // form.getNodes("h:html/h:head/xforms:model/xforms:instance");
-               NodeIterator instances = form.getNode("h:html/h:head/xforms:model").getNodes("xforms:instance");
-               Node primaryInstance = null;
-               while (instances.hasNext()) {
-                       Node instance = instances.nextNode();
-                       if (primaryInstance == null) {
-                               primaryInstance = instance;
-                       } else {// secondary instances
-                               String instanceId = instance.getProperty("id").getString();
-                               URI instanceUri = null;
-                               if (instance.hasProperty("src"))
-                                       try {
-                                               instanceUri = new URI(instance.getProperty("src").getString());
-                                       } catch (URISyntaxException e) {
-                                               throw new IllegalArgumentException("Instance " + instanceId + " has a badly formatted URI", e);
-                                       }
-                               if (instanceUri != null) {
-                                       if ("jr".equals(instanceUri.getScheme())) {
-                                               String type = instanceUri.getHost();
-                                               if ("file".equals(type)) {
-                                                       Node manifest = JcrUtils.getOrAdd(form, OrxManifestName.manifest.name(),
-                                                                       OrxManifestName.manifest.get());
-                                                       Node file = JcrUtils.getOrAdd(manifest, instanceId);
-                                                       String path = instanceUri.getPath();
-                                                       if (!path.endsWith(".xml"))
-                                                               throw new IllegalArgumentException("File uri " + instanceUri + " must end with .xml");
-                                                       path = path.substring(0, path.length() - ".xml".length());
-                                                       Node target = file.getSession().getNode(path);
-                                                       if (target.isNodeType(NodeType.MIX_REFERENCEABLE)) {
-                                                               file.setProperty(Property.JCR_ID, target);
-                                                               if (file.hasProperty(Property.JCR_PATH))
-                                                                       file.getProperty(Property.JCR_PATH).remove();
-                                                       } else {
-                                                               file.setProperty(Property.JCR_PATH, target.getPath());
-                                                               if (file.hasProperty(Property.JCR_ID))
-                                                                       file.getProperty(Property.JCR_ID).remove();
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               if (primaryInstance == null)
-                       throw new IllegalArgumentException("No primary instance found in " + form);
-               if (!primaryInstance.hasNodes())
-                       throw new IllegalArgumentException("No data found in primary instance of " + form);
-               NodeIterator primaryInstanceChildren = primaryInstance.getNodes();
-               Node data = primaryInstanceChildren.nextNode();
-               if (primaryInstanceChildren.hasNext())
-                       throw new IllegalArgumentException("More than one data found in primary instance of " + form);
-               String formId = data.getProperty("id").getString();
-               if (previousFormId != null && !formId.equals(previousFormId))
-                       log.warn("Form id of " + form + " changed from " + previousFormId + " to " + formId);
-               form.setProperty(OrxListName.formID.get(), formId);
-               String formVersion = data.getProperty("version").getString();
-
-               if (previousCsum == null)// save before checksuming
-                       s.save();
-               String newCsum;
-               try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-                       s.exportDocumentView(form.getPath() + "/" + OdkNames.H_HTML, out, true, false);
-                       newCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray());
-               }
-               if (previousCsum == null) {
-                       JcrxApi.addChecksum(form, newCsum);
-                       JcrUtils.updateLastModified(form);
-                       form.setProperty(OrxListName.version.get(), formVersion);
-                       s.save();
-                       s.getWorkspace().getVersionManager().checkpoint(form.getPath());
-                       if (log.isDebugEnabled())
-                               log.debug("New form " + form);
-               } else {
-                       if (newCsum.equals(previousCsum)) {
-                               // discard
-                               s.refresh(false);
-                               if (log.isDebugEnabled())
-                                       log.debug("Unmodified form " + form);
-                               return;
-                       } else {
-                               if (formVersion.equals(previousFormVersion)) {
-                                       s.refresh(false);
-                                       throw new IllegalArgumentException("Form " + form + " has been changed but version " + formVersion
-                                                       + " has not been changed, discarding changes...");
-                               }
-                               form.setProperty(OrxListName.version.get(), formVersion);
-                               JcrxApi.addChecksum(form, newCsum);
-                               JcrUtils.updateLastModified(form);
-                               s.save();
-                               s.getWorkspace().getVersionManager().checkpoint(form.getPath());
-                               if (log.isDebugEnabled()) {
-                                       log.debug("Updated form " + form);
-                                       log.debug("Previous csum " + previousCsum);
-                                       log.debug("New csum " + newCsum);
-                               }
-                       }
-               }
-       }
-
-       /** Singleton. */
-       private OdkUtils() {
-
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxListName.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxListName.java
deleted file mode 100644 (file)
index 0404c90..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.argeo.support.odk;
-
-import org.argeo.entity.JcrName;
-
-/** Types related to the http://openrosa.org/xforms/xformsList namespace. */
-public enum OrxListName implements JcrName {
-       xform,
-       // names
-       formID, version;
-
-       @Override
-       public String getPrefix() {
-               return prefix();
-       }
-
-       public static String prefix() {
-               return "orxList";
-       }
-
-       @Override
-       public String getNamespace() {
-               return namespace();
-       }
-
-       public static String namespace() {
-               return "http://openrosa.org/xforms/xformsList";
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxManifestName.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxManifestName.java
deleted file mode 100644 (file)
index c9fcc5d..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.argeo.support.odk;
-
-import org.argeo.entity.JcrName;
-
-/** Types related to the http://openrosa.org/xforms/xformsList namespace. */
-public enum OrxManifestName implements JcrName {
-       manifest, mediaFile;
-
-       @Override
-       public String getPrefix() {
-               return prefix();
-       }
-
-       public static String prefix() {
-               return "orxManifest";
-       }
-
-       @Override
-       public String getNamespace() {
-               return namespace();
-       }
-
-       public static String namespace() {
-               return "http://openrosa.org/xforms/xformsManifest";
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxType.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/OrxType.java
deleted file mode 100644 (file)
index 3b5d601..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.argeo.support.odk;
-
-import org.argeo.entity.JcrName;
-
-/** Types related to the http://openrosa.org/xforms/xformsList namespace. */
-public enum OrxType implements JcrName {
-       submission, xml_submission_file;
-
-       @Override
-       public String getPrefix() {
-               return prefix();
-       }
-
-       public static String prefix() {
-               return "orx";
-       }
-
-       @Override
-       public String getNamespace() {
-               return namespace();
-       }
-
-       public static String namespace() {
-               return "http://openrosa.org/xforms";
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/odk.cnd b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/odk.cnd
deleted file mode 100644 (file)
index d80096d..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<jr = "http://openrosa.org/javarosa">
-<orx = "http://openrosa.org/xforms">
-<orxList = "http://openrosa.org/xforms/xformsList">
-<orxManifest = "http://openrosa.org/xforms/xformsManifest">
-<odk = "http://www.opendatakit.org/xforms">
-
-
-[odk:head]
-+ h:title (jcrx:xmlvalue) = jcrx:xmlvalue
-+ xforms:model (odk:model) = odk:model
-
-[odk:body] > xforms:ui
-
-
-[odk:html] > mix:referenceable
-+ h:head (odk:head) = odk:head
-+ h:body (odk:body) = odk:body
-
-[odk:model] > xforms:model
-+ odk:setgeopoint (odk:setgeopoint) = odk:setgeopoint
-+ xforms:itext (odk:itext) = odk:itext
-
-[odk:itext]
-+ xforms:translation (odk:translation) = odk:translation *
-
-[odk:translation]
-- lang (STRING) m
-- default (STRING)
-+ xforms:text (odk:text) = odk:text *
-
-[odk:text]
-- id (STRING) m
-+ xforms:value (jcrx:xmlvalue) = jcrx:xmlvalue
-
-[odk:setgeopoint]
-- event (STRING)
-- ref (STRING)
-
-// OpenRosa web API
-
-[orxList:xform] > mix:created, mix:lastModified, jcrx:csum, entity:form
-- orxList:formID (STRING)
-- orxList:version (STRING)
-+ h:html (odk:html) = odk:html
-+ manifest (orxManifest:manifest) = orxManifest:manifest
-
-[orxManifest:manifest]
-+ * (orxManifest:mediaFile) = orxManifest:mediaFile
-
-[orxManifest:mediaFile] > nt:address, jcrx:csum
-
-[orx:submission] > mix:created, entity:formSubmission
-+ xml_submission_file (nt:unstructured) = nt:unstructured
-+ * (nt:file) *
-
-
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormListServlet.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormListServlet.java
deleted file mode 100644 (file)
index 7c752c7..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.argeo.support.odk.servlet;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.query.Query;
-import javax.jcr.query.QueryResult;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.api.NodeConstants;
-import org.argeo.cms.servlet.ServletAuthUtils;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrxApi;
-import org.argeo.support.odk.OdkForm;
-import org.argeo.support.odk.OrxListName;
-import org.argeo.support.odk.OrxManifestName;
-
-/** Lists available forms. */
-public class OdkFormListServlet extends HttpServlet {
-       private static final long serialVersionUID = 2706191315048423321L;
-       private final static Log log = LogFactory.getLog(OdkFormListServlet.class);
-
-       private Set<OdkForm> odkForms = Collections.synchronizedSet(new HashSet<>());
-
-//     private DateTimeFormatter versionFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmm")
-//                     .withZone(ZoneId.from(ZoneOffset.UTC));
-
-       private Repository repository;
-
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               resp.setContentType("text/xml; charset=utf-8");
-               resp.setHeader("X-OpenRosa-Version", "1.0");
-               resp.setDateHeader("Date", System.currentTimeMillis());
-
-               String serverName = req.getServerName();
-               int serverPort = req.getServerPort();
-               String protocol = serverPort == 443 || req.isSecure() ? "https" : "http";
-
-               String pathInfo = req.getPathInfo();
-
-               Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, NodeConstants.SYS_WORKSPACE), req);
-//             session = NodeUtils.openDataAdminSession(repository, NodeConstants.SYS_WORKSPACE);
-               Writer writer = resp.getWriter();
-               writer.append("<?xml version='1.0' encoding='UTF-8' ?>");
-               writer.append("<xforms xmlns=\"http://openrosa.org/xforms/xformsList\">");
-               boolean oldApproach = false;
-               if (!oldApproach) {
-                       try {
-
-                               Query query;
-                               if (pathInfo == null) {
-//                             query = session.getWorkspace().getQueryManager()
-//                                             .createQuery("SELECT * FROM [nt:unstructured]", Query.JCR_SQL2);
-                                       query = session.getWorkspace().getQueryManager()
-                                                       .createQuery("SELECT * FROM [" + OrxListName.xform.get() + "]", Query.JCR_SQL2);
-                               } else {
-                                       query = session.getWorkspace().getQueryManager()
-                                                       .createQuery(
-                                                                       "SELECT node FROM [" + OrxListName.xform.get()
-                                                                                       + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo + "')",
-                                                                       Query.JCR_SQL2);
-                               }
-                               QueryResult queryResult = query.execute();
-
-                               NodeIterator nit = queryResult.getNodes();
-//                             log.debug(session.getUserID());
-//                             log.debug(session.getWorkspace().getName());
-//                             NodeIterator nit = session.getRootNode().getNodes();
-//                             while (nit.hasNext()) {
-//                                     log.debug(nit.nextNode());
-//                             }
-                               while (nit.hasNext()) {
-                                       StringBuilder sb = new StringBuilder();
-                                       Node node = nit.nextNode();
-                                       if (node.isNodeType(OrxListName.xform.get())) {
-                                               sb.append("<xform>");
-                                               sb.append("<formID>" + node.getProperty(OrxListName.formID.get()).getString() + "</formID>");
-                                               sb.append("<name>" + Jcr.getTitle(node) + "</name>");
-                                               sb.append("<version>" + node.getProperty(OrxListName.version.get()).getString() + "</version>");
-                                               sb.append("<hash>md5:" + JcrxApi.getChecksum(node, JcrxApi.MD5) + "</hash>");
-                                               if (node.hasProperty(Property.JCR_DESCRIPTION))
-                                                       sb.append("<name>" + node.getProperty(Property.JCR_DESCRIPTION).getString() + "</name>");
-                                               sb.append("<downloadUrl>" + protocol + "://" + serverName
-                                                               + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + "/api/odk/form/"
-                                                               + node.getPath() + "</downloadUrl>");
-                                               if (node.hasNode(OrxManifestName.manifest.name())) {
-                                                       sb.append("<manifestUrl>" + protocol + "://" + serverName
-                                                                       + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort)
-                                                                       + "/api/odk/formManifest" + node.getNode(OrxManifestName.manifest.name()).getPath()
-                                                                       + "</manifestUrl>");
-                                               }
-                                               sb.append("</xform>");
-                                       } else if (node.isNodeType(EntityType.formSet.get())) {
-                                               sb.append("<xforms-group>");
-                                               sb.append("<groupId>" + node.getPath() + "</groupId>");
-                                               sb.append("<name>" + node.getProperty(Property.JCR_TITLE).getString() + "</name>");
-                                               sb.append("<listUrl>" + protocol + "://" + serverName
-                                                               + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + "/api/odk/formList"
-                                                               + node.getPath() + "</listUrl>");
-                                               sb.append("</xforms-group>");
-                                       }
-                                       String str = sb.toString();
-                                       if (!str.equals("")) {
-                                               if (log.isDebugEnabled())
-                                                       log.debug(str);
-                                               writer.append(str);
-                                       }
-                               }
-                       } catch (RepositoryException e) {
-                               e.printStackTrace();
-                               // TODO error message
-                               // resp.sendError(500);
-                               resp.sendError(503);
-                       } finally {
-                               Jcr.logout(session);
-                       }
-
-               } else {
-                       for (OdkForm form : odkForms) {
-                               StringBuilder sb = new StringBuilder();
-                               sb.append("<xform>");
-                               sb.append("<formID>" + form.getFormId() + "</formID>");
-                               sb.append("<name>" + form.getName() + "</name>");
-                               sb.append("<version>" + form.getVersion() + "</version>");
-                               sb.append("<hash>" + form.getHash(null) + "</hash>");
-                               sb.append("<descriptionText>" + form.getDescription() + "</descriptionText>");
-                               sb.append("<downloadUrl>" + protocol + "://" + serverName
-                                               + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort) + "/api/odk/form/"
-                                               + form.getFileName() + "</downloadUrl>");
-                               sb.append("</xform>");
-                               String str = sb.toString();
-                               if (log.isDebugEnabled())
-                                       log.debug(str);
-                               writer.append(str);
-                       }
-               }
-               writer.append("</xforms>");
-       }
-
-       public void addForm(OdkForm odkForm) {
-               odkForms.add(odkForm);
-       }
-
-       public void removeForm(OdkForm odkForm) {
-               odkForms.remove(odkForm);
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormServlet.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkFormServlet.java
deleted file mode 100644 (file)
index cab562c..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.argeo.support.odk.servlet;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.FilenameUtils;
-import org.argeo.cms.servlet.ServletAuthUtils;
-import org.argeo.jcr.Jcr;
-import org.argeo.support.odk.OdkForm;
-import org.argeo.support.odk.OdkNames;
-
-/** Retrieves a single form. */
-public class OdkFormServlet extends HttpServlet {
-       private static final long serialVersionUID = 7838305967987687370L;
-
-       private Repository repository;
-       private Map<String, OdkForm> odkForms = Collections.synchronizedMap(new HashMap<>());
-
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               resp.setContentType("text/xml; charset=utf-8");
-
-               Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
-
-               String pathInfo = req.getPathInfo();
-               if (pathInfo.startsWith("//"))
-                       pathInfo = pathInfo.substring(1);
-
-               boolean oldApproach = false;
-               try {
-                       if (!oldApproach) {
-                               String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8);
-                               session.exportDocumentView(path + "/" + OdkNames.H_HTML, resp.getOutputStream(), true, false);
-                       } else {
-
-                               String fileName = FilenameUtils.getName(pathInfo);
-                               OdkForm form = odkForms.get(fileName);
-                               if (form == null)
-                                       throw new IllegalArgumentException("No form named " + fileName + " was found");
-
-                               byte[] buffer = new byte[1024];
-                               try (InputStream in = form.openStream(); OutputStream out = resp.getOutputStream();) {
-                                       int bytesRead;
-                                       while ((bytesRead = in.read(buffer)) != -1)
-                                               out.write(buffer, 0, bytesRead);
-                               }
-                       }
-               } catch (RepositoryException e) {
-                       e.printStackTrace();
-                       // TODO error message
-                       resp.sendError(500);
-               } finally {
-                       Jcr.logout(session);
-               }
-       }
-
-       public void addForm(OdkForm odkForm) {
-               odkForms.put(odkForm.getFileName(), odkForm);
-       }
-
-       public void removeForm(OdkForm odkForm) {
-               odkForms.remove(odkForm.getFileName());
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkManifestServlet.java
deleted file mode 100644 (file)
index 88b9c69..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.argeo.support.odk.servlet;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.cms.servlet.ServletAuthUtils;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-import org.argeo.support.odk.OrxManifestName;
-import org.argeo.util.DigestUtils;
-
-/** Describe additional files. */
-public class OdkManifestServlet extends HttpServlet {
-       private static final long serialVersionUID = 138030510865877478L;
-
-       private Repository repository;
-
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               resp.setContentType("text/xml; charset=utf-8");
-               resp.setHeader("X-OpenRosa-Version", "1.0");
-               resp.setDateHeader("Date", System.currentTimeMillis());
-
-               String pathInfo = req.getPathInfo();
-               if (pathInfo.startsWith("//"))
-                       pathInfo = pathInfo.substring(1);
-
-               String serverName = req.getServerName();
-               int serverPort = req.getServerPort();
-               String protocol = serverPort == 443 || req.isSecure() ? "https" : "http";
-
-               Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
-
-               try {
-                       Node node = session.getNode(pathInfo);
-                       if (node.isNodeType(OrxManifestName.manifest.get())) {
-                               Writer writer = resp.getWriter();
-                               writer.append("<?xml version='1.0' encoding='UTF-8' ?>");
-                               writer.append("<manifest xmlns=\"http://openrosa.org/xforms/xformsManifest\">");
-                               NodeIterator nit = node.getNodes();
-                               while (nit.hasNext()) {
-                                       Node file = nit.nextNode();
-                                       if (file.isNodeType(OrxManifestName.mediaFile.get())) {
-                                               writer.append("<mediaFile>");
-
-                                               if (file.isNodeType(NodeType.NT_ADDRESS)) {
-                                                       Node target = file.getProperty(Property.JCR_ID).getNode();
-                                                       writer.append("<filename>");
-                                                       writer.append(target.getPath().substring(1) + ".xml");
-                                                       writer.append("</filename>");
-                                                       try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-                                                               session.exportDocumentView(target.getPath(), out, true, false);
-                                                               String fileCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray());
-//                                             JcrxApi.addChecksum(file, fileCsum);
-                                                               writer.append("<hash>");
-                                                               writer.append("md5sum:" + fileCsum);
-                                                               writer.append("</hash>");
-                                                       }
-                                                       writer.append("<downloadUrl>" + protocol + "://" + serverName
-                                                                       + (serverPort == 80 || serverPort == 443 ? "" : ":" + serverPort)
-                                                                       + "/api/odk/formManifest" + file.getPath() + "</downloadUrl>");
-                                               }
-                                               writer.append("</mediaFile>");
-                                       }
-                               }
-
-                               writer.append("</manifest>");
-                       } else if (node.isNodeType(OrxManifestName.mediaFile.get())) {
-                               if (node.isNodeType(NodeType.NT_ADDRESS)) {
-                                       Node target = node.getProperty(Property.JCR_ID).getNode();
-                                       try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-                                               session.exportDocumentView(target.getPath(), out, true, false);
-                                               System.out.println(new String(out.toByteArray(), StandardCharsets.UTF_8));
-                                               resp.getOutputStream().write(out.toByteArray());
-                                       }
-                               } else {
-                                       throw new IllegalArgumentException("Unsupported node " + node);
-                               }
-                       } else {
-                               throw new IllegalArgumentException("Unsupported node " + node);
-                       }
-               } catch (RepositoryException e) {
-                       throw new JcrException(e);
-               } finally {
-                       Jcr.logout(session);
-               }
-
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkServletContext.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkServletContext.java
deleted file mode 100644 (file)
index 1711f2d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.argeo.support.odk.servlet;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.argeo.cms.servlet.PrivateWwwAuthServletContext;
-
-/** OSK specific authentication (with additional headers).*/
-public class OdkServletContext extends PrivateWwwAuthServletContext {
-
-       @Override
-       protected void askForWwwAuth(HttpServletRequest request, HttpServletResponse response) {
-               super.askForWwwAuth(request, response);
-               response.setHeader("X-OpenRosa-Version", "1.0");
-               response.setDateHeader("Date", System.currentTimeMillis());
-
-       }
-
-}
diff --git a/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkSubmissionServlet.java b/knowledge/org.argeo.support.odk/src/org/argeo/support/odk/servlet/OdkSubmissionServlet.java
deleted file mode 100644 (file)
index 70a80c0..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-package org.argeo.support.odk.servlet;
-
-import java.io.IOException;
-import java.time.Instant;
-import java.time.ZoneId;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.jcr.ImportUUIDBehavior;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.Part;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.api.NodeUtils;
-import org.argeo.cms.auth.CmsSession;
-import org.argeo.cms.servlet.ServletAuthUtils;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.suite.SuiteUtils;
-import org.argeo.support.odk.OrxType;
-import org.argeo.support.xforms.FormSubmissionListener;
-
-/** Receives a form submission. */
-public class OdkSubmissionServlet extends HttpServlet {
-       private static final long serialVersionUID = 7834401404691302385L;
-       private final static Log log = LogFactory.getLog(OdkSubmissionServlet.class);
-
-       private final static String XML_SUBMISSION_FILE = "xml_submission_file";
-
-       private DateTimeFormatter submissionNameFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmmssSSS")
-                       .withZone(ZoneId.from(ZoneOffset.UTC));
-
-       private Repository repository;
-
-       private Set<FormSubmissionListener> submissionListeners = new HashSet<>();
-
-       @Override
-       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               resp.setContentType("text/xml; charset=utf-8");
-               resp.setHeader("X-OpenRosa-Version", "1.0");
-               resp.setDateHeader("Date", System.currentTimeMillis());
-               resp.setIntHeader("X-OpenRosa-Accept-Content-Length", 1024 * 1024);
-
-               Session session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
-
-               try {
-//                     Node submissions = JcrUtils.mkdirs(session,
-//                                     "/" + EntityType.form.get() + "/" + EntityNames.SUBMISSIONS_BASE);
-                       CmsSession cmsSession = ServletAuthUtils.getCmsSession(req);
-
-                       ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader();
-                       Thread.currentThread().setContextClassLoader(ServletAuthUtils.class.getClassLoader());
-                       Session adminSession = null;
-                       try {
-                               // TODO centralise at a deeper level
-                               adminSession = NodeUtils.openDataAdminSession(repository, null);
-                               SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession);
-                       } finally {
-                               Jcr.logout(adminSession);
-                               Thread.currentThread().setContextClassLoader(currentContextCl);
-                       }
-
-                       Node cmsSessionNode = SuiteUtils.getCmsSessionNode(session, cmsSession);
-                       Node submission = cmsSessionNode.addNode(submissionNameFormatter.format(Instant.now()),
-                                       OrxType.submission.get());
-                       for (Part part : req.getParts()) {
-                               if (log.isDebugEnabled())
-                                       log.debug("Part: " + part.getName() + ", " + part.getContentType());
-
-                               if (part.getName().equals(XML_SUBMISSION_FILE)) {
-                                       Node xml = submission.addNode(XML_SUBMISSION_FILE, NodeType.NT_UNSTRUCTURED);
-                                       session.importXML(xml.getPath(), part.getInputStream(),
-                                                       ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
-
-                               } else {
-                                       Node fileNode = JcrUtils.copyStreamAsFile(submission, part.getName(), part.getInputStream());
-                                       String contentType = part.getContentType();
-                                       if (contentType != null) {
-                                               fileNode.addMixin(NodeType.MIX_MIMETYPE);
-                                               fileNode.setProperty(Property.JCR_MIMETYPE, contentType);
-
-                                       }
-                                       if (part.getName().endsWith(".jpg") || part.getName().endsWith(".png")) {
-                                               // TODO meta data and thumbnails
-                                       }
-                               }
-                       }
-                       session.save();
-                       for (FormSubmissionListener submissionListener : submissionListeners) {
-                               submissionListener.formSubmissionReceived(submission);
-                       }
-               } catch (RepositoryException e) {
-                       e.printStackTrace();
-                       resp.setStatus(503);
-                       return;
-               } finally {
-                       Jcr.logout(session);
-               }
-
-               resp.setStatus(201);
-               resp.getWriter().write("<OpenRosaResponse xmlns=\"http://openrosa.org/http/response\">"
-                               + "<message>Form Received!</message>" + "</OpenRosaResponse>");
-
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public synchronized void addSubmissionListener(FormSubmissionListener listener) {
-               submissionListeners.add(listener);
-       }
-
-       public synchronized void removeSubmissionListener(FormSubmissionListener listener) {
-               submissionListeners.remove(listener);
-       }
-}
diff --git a/knowledge/org.argeo.support.xforms/.classpath b/knowledge/org.argeo.support.xforms/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/knowledge/org.argeo.support.xforms/.gitignore b/knowledge/org.argeo.support.xforms/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/knowledge/org.argeo.support.xforms/.project b/knowledge/org.argeo.support.xforms/.project
deleted file mode 100644 (file)
index 3c50bfa..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.support.xforms</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/knowledge/org.argeo.support.xforms/META-INF/.gitignore b/knowledge/org.argeo.support.xforms/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/knowledge/org.argeo.support.xforms/bnd.bnd b/knowledge/org.argeo.support.xforms/bnd.bnd
deleted file mode 100644 (file)
index 23c86a9..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-Require-Capability:\
-cms.datamodel;filter:="(name=entity)"
-
-Provide-Capability:\
-cms.datamodel; name=xforms; cnd=/org/argeo/support/xforms/xforms.cnd
diff --git a/knowledge/org.argeo.support.xforms/build.properties b/knowledge/org.argeo.support.xforms/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/knowledge/org.argeo.support.xforms/pom.xml b/knowledge/org.argeo.support.xforms/pom.xml
deleted file mode 100644 (file)
index d97f8c7..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>knowledge</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.support.xforms</artifactId>
-       <name>XForms support</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.core</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/FormSubmissionListener.java b/knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/FormSubmissionListener.java
deleted file mode 100644 (file)
index e23ef36..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.argeo.support.xforms;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-/** Called when a user has received a new form submission. */
-public interface FormSubmissionListener {
-       /** Called after a form submission has been stored in the user area. */
-       void formSubmissionReceived(Node node) throws RepositoryException;
-}
diff --git a/knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/xforms.cnd b/knowledge/org.argeo.support.xforms/src/org/argeo/support/xforms/xforms.cnd
deleted file mode 100644 (file)
index c24dbae..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-<xforms = "http://www.w3.org/2002/xforms">
-
-[xforms:model]
-+ xforms:instance (xforms:instance) = xforms:instance *
-+ xforms:bind (xforms:bind) = xforms:bind *
-+ xforms:setvalue (xforms:setvalue) = xforms:setvalue *
-
-[xforms:instance] > nt:unstructured
-
-[xforms:bind]
-- * (STRING)
-
-[xforms:setvalue]
-- * (STRING)
-
-[xforms:select] > xforms:input
-+ xforms:itemset (xforms:itemset) = xforms:itemset
-
-[xforms:itemset]
-- nodeset (STRING)
-+ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue
-+ xforms:value (jcrx:xmlvalue) = jcrx:xmlvalue
-
-[xforms:ui]
-- * (STRING)
-+ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue *
-+ xforms:hint (jcrx:xmlvalue) = jcrx:xmlvalue *
-+ xforms:input (xforms:input) = xforms:input *
-+ xforms:select (xforms:select) = xforms:select *
-+ xforms:select1 (xforms:select) = xforms:select *
-+ xforms:trigger (xforms:input) = xforms:input *
-+ xforms:upload (xforms:input) = xforms:input *
-+ xforms:group (xforms:ui) = xforms:ui *
-+ xforms:repeat (xforms:ui) = xforms:ui *
-
-[xforms:input]
-- * (STRING)
-+ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue
-+ xforms:hint (jcrx:xmlvalue) = jcrx:xmlvalue *
diff --git a/knowledge/org.argeo.support.xforms/xsd/XForms-Schema.xsd b/knowledge/org.argeo.support.xforms/xsd/XForms-Schema.xsd
deleted file mode 100644 (file)
index 6383f86..0000000
+++ /dev/null
@@ -1,858 +0,0 @@
-<xsd:schema targetNamespace="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" elementFormDefault="qualified">
- <!--
-  Changes:
-26-Aug MJD fixed typo where more than one child allowed on <instance>
-04-Sep MJD fixed typo on <send> : attribute 'submission' is required
-04-Sep MJD fixed typo on <rebuild><recalculate><revalidate><refresh>: 'model' attribute is required
-06-Sep MJD clarified specific allowed values of @level on <message>
-06-Sep MJD removed UI Common attributes from <help><hint><alert><label>
-09-Sep MJD changed minOccurrs and maxOccurs to use XPath expressions, default values
-09-Sep MJD fixed typo: added linking attributes to <message>
-09-Sep MJD removed <extension> from content models of <mode> and UI common elements
-09-Sep MJD fixed typo: removed 'format' attribute
-17-Sep MJD fixed typo: <output> now uses the attribute group for binding attributes, instead of similarly named individual attrs
-17-Sep MJD added XPathExpression simpleType for internal use. This doesn't actually change anything, but makes
-the Schema a better documentation resource (instead of using xsd:string for everything)
-17-Sep MJD removed 'mediatype' attribute from <submission>, as it was unused
-17-Sep MJD fixed typo: only 'ref' and 'bind' attributes, not 'model' on <submission>
-17-Sep MJD added XML Events attributes to <model>
-17-Sep MJD in accordance with 3.2.1, removed all id attributes
-19-Sep MJD fixed typo: clarified that nested <action>s are permitted.
-19-Sep MJD factor UI.Inline into <group>. Renamed <group>s and <attributeGroup>s to match the prose names
-19-Sep MJD changed to agreed-upon namespace for CR
-25-Sep MJD fixed typo: added UI.Inlne to content model of <message>, enabled mixed content
-29-Sep MJD fixed typo: 'model' required on <reset>
-29-Sep MJD fixed typo: binding attributes allowed on <submit>
-29-Sep MJD fixed typo: explicit enumerated values for 'show' on <load>
-04-Oct MJD 'resource' attribute not required
-
-12-Nov 2002 : Published as CR
-
-13-Jan MJD added new attribute includenamespaceprefixes on <submission>
-13-Jan MJD added UI Common elements to content model of <group>
-03-Feb MJD synchoninzed duration types with 15 Nov Query Operators document
-31-Mar MJD added mediatype attribute on <submission>
-14-May MJD typo : "xsd:NCName"
-26-Jun MJD removed 'accesskey' and 'navindex' (over to host language definition)
-
-01-Aug 2003 : Published as PR
-
-15-Sep MJD final namespace
-15-Sep MJD corrected content model of <value>
-15-Sep MJD changed the name of the import for XML Events to highlight that only the attributes are used
-
-1.0 Second Edition errata
-
-16-Apr 2005 RAM - erratum E4 - optional @model
-16-Apr 2005 RAM - erratum E22 - default value for @show
-16-Apr 2005 RAM - erratum E54 - remove xforms:minOccurs and xforms:maxOccurs
-26-Jun 2005 RAM - erratum E71 - allow an empty case element
-
-16-Jun 2006 JMB - erratum E69 - instance attribute in submission; id in common attributes
-
-15-Aug-2006 CFW - erratum E18 on 2nd ed. Added Action to content model for Case
-
-09-Sep 2006 JMB - non-substantive: explicitly declared some use="optional" settings, 
-                  substantive: erratum E18 on 2nd ed. Declared default false for selected attribute of case
-                  substantive: erratum E21 on 2nd ed. Added multipart-post to enumeration of method attribute
-23-Nov 2006 JMB - substantive: erratum E32 on 2nd ed. switch in repeat
-17-Jul 2007 JMB - substantive: erratum E41 on 2nd ed. version attribute and associated simple types
--->
- <xsd:import namespace="http://www.w3.org/2001/xml-events" schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xml-events-attribs-1.xsd"/>
- <xsd:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://www.w3.org/2001/XMLSchema.xsd"/>
- <!--
-structural elements
--->
- <xsd:attributeGroup name="Common.Attributes">
-  <xsd:annotation>
-   <xsd:documentation>Attributes for _every_ element in XForms</xsd:documentation>
-  </xsd:annotation>
-                <xsd:attribute name="id" type="xsd:ID" use="optional"/>  
-  <xsd:anyAttribute namespace="##other"/>
- </xsd:attributeGroup>
- <xsd:element name="model">
-  <xsd:complexType>
-   <xsd:sequence minOccurs="0" maxOccurs="unbounded">
-    <xsd:choice>
-     <xsd:element ref="xforms:instance"/>
-     <xsd:element ref="xsd:schema"/>
-     <xsd:element ref="xforms:submission"/>
-     <xsd:element ref="xforms:bind"/>
-     <xsd:group ref="xforms:Action"/>
-    </xsd:choice>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-   <xsd:attribute name="functions" type="xforms:QNameList" use="optional"/>
-   <xsd:attribute name="schema" type="xforms:anyURIList" use="optional"/>
-   <xsd:attribute name="version" type="xforms:versionList" use="optional"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="instance">
-  <xsd:annotation>
-   <xsd:documentation>instance container.</xsd:documentation>
-  </xsd:annotation>
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:any namespace="##any" processContents="skip" minOccurs="0"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Linking.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="submission">
-  <xsd:annotation>
-   <xsd:documentation>submit info container.</xsd:documentation>
-  </xsd:annotation>
-  <xsd:complexType>
-   <xsd:sequence minOccurs="0" maxOccurs="unbounded">
-    <xsd:group ref="xforms:Action"/>
-   </xsd:sequence>
-
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-
-   <xsd:attribute name="ref" type="xforms:XPathExpression" use="optional"/>
-   <xsd:attribute name="bind" type="xsd:IDREF" use="optional"/>
-   <xsd:attribute name="action" type="xsd:anyURI" use="optional"/>
-
-   <xsd:attribute name="method" use="required">
-    <xsd:simpleType>
-     <xsd:union memberTypes="xforms:QNameButNotNCNAME">
-      <xsd:simpleType>
-       <xsd:restriction base="xsd:string">
-        <xsd:enumeration value="post"/>
-        <xsd:enumeration value="put"/>
-        <xsd:enumeration value="get"/>
-        <xsd:enumeration value="multipart-post"/>
-        <xsd:enumeration value="form-data-post"/>
-        <xsd:enumeration value="urlencoded-post"/>
-       </xsd:restriction>
-      </xsd:simpleType>
-     </xsd:union>
-    </xsd:simpleType>
-   </xsd:attribute>
-
-   <xsd:attribute name="version" type="xsd:NMTOKEN" use="optional"/>
-   <xsd:attribute name="indent" type="xsd:boolean" use="optional"/>
-   <xsd:attribute name="mediatype" type="xsd:string" use="optional"/>
-   <xsd:attribute name="encoding" type="xsd:string" use="optional"/>
-   <xsd:attribute name="omit-xml-declaration" type="xsd:boolean" use="optional"/>
-   <xsd:attribute name="standalone" type="xsd:boolean" use="optional"/>
-   <xsd:attribute name="cdata-section-elements" type="xforms:QNameList" use="optional"/>
-
-                       <xsd:attribute name="replace" use="optional" default="all">
-    <xsd:simpleType>
-     <xsd:union memberTypes="xforms:QNameButNotNCNAME">
-      <xsd:simpleType>
-       <xsd:restriction base="xsd:string">
-        <xsd:enumeration value="all"/>
-        <xsd:enumeration value="instance"/>
-        <xsd:enumeration value="none"/>
-       </xsd:restriction>
-      </xsd:simpleType>
-     </xsd:union>
-    </xsd:simpleType>
-   </xsd:attribute>
-
-                        <xsd:attribute name="instance" type="xsd:IDREF" use="optional"/>
-
-   <xsd:attribute name="separator" use="optional" default=";">
-    <xsd:simpleType>
-     <xsd:restriction base="xsd:string">
-      <xsd:enumeration value=";"/>
-      <xsd:enumeration value="&amp;"/>
-     </xsd:restriction>
-    </xsd:simpleType>
-   </xsd:attribute>
-
-                        <xsd:attribute name="includenamespaceprefixes" use="optional">
-                          <xsd:simpleType>
-                            <xsd:list>
-                              <xsd:simpleType>
-                                <xsd:union>
-                                  <xsd:simpleType>
-                                    <xsd:restriction base='xsd:NCName'/>
-                                  </xsd:simpleType>
-                                  <xsd:simpleType>
-                                    <xsd:restriction base='xsd:string'>
-                                      <xsd:enumeration value='#default'/>
-                                    </xsd:restriction>
-                                  </xsd:simpleType>
-                                </xsd:union>
-                              </xsd:simpleType>
-                            </xsd:list>
-                          </xsd:simpleType>
-                        </xsd:attribute>
-
-  </xsd:complexType>
- </xsd:element>
- <xsd:attributeGroup name="Linking.Attributes">
-  <xsd:attribute name="src" type="xsd:anyURI"/>
- </xsd:attributeGroup>
- <xsd:element name="bind">
-  <xsd:annotation>
-   <xsd:documentation>Definition of bind container.</xsd:documentation>
-  </xsd:annotation>
-  <xsd:complexType>
-   <xsd:sequence minOccurs="0" maxOccurs="unbounded">
-    <xsd:element ref="xforms:bind"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="nodeset" type="xforms:XPathExpression" use="optional"/>
-   <xsd:attribute name="type" type="xsd:QName" use="optional"/>
-   <xsd:attribute name="readonly" type="xforms:XPathExpression" use="optional"/>
-   <xsd:attribute name="required" type="xforms:XPathExpression" use="optional"/>
-   <xsd:attribute name="relevant" type="xforms:XPathExpression" use="optional"/>
-   <xsd:attribute name="constraint" type="xforms:XPathExpression" use="optional"/>
-   <xsd:attribute name="calculate" type="xforms:XPathExpression" use="optional"/>
-   <xsd:attribute name="p3ptype" type="xsd:string" use="optional"/>
-   <!-- E54 -->
-  </xsd:complexType>
- </xsd:element>
- <!--
-User Interface form controls
--->
- <xsd:group name="Form.Controls">
-  <xsd:choice>
-   <xsd:element ref="xforms:input"/>
-   <xsd:element ref="xforms:textarea"/>
-   <xsd:element ref="xforms:secret"/>
-   <xsd:element ref="xforms:output"/>
-   <xsd:element ref="xforms:upload"/>
-   <xsd:element ref="xforms:select1"/>
-   <xsd:element ref="xforms:select"/>
-   <xsd:element ref="xforms:range"/>
-   <xsd:element ref="xforms:submit"/>
-   <xsd:element ref="xforms:trigger"/>
-  </xsd:choice>
- </xsd:group>
- <xsd:attributeGroup name="Single.Node.Binding.Attributes">
-  <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
-  <xsd:attribute name="ref" type="xforms:XPathExpression" use="optional"/>
-  <xsd:attribute name="bind" type="xsd:IDREF" use="optional"/>
- </xsd:attributeGroup>
- <xsd:attributeGroup name="Nodeset.Binding.Attributes">
-  <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
-  <xsd:attribute name="nodeset" type="xforms:XPathExpression" use="optional"/>
-  <xsd:attribute name="bind" type="xsd:IDREF" use="optional"/>
- </xsd:attributeGroup>
- <xsd:attributeGroup name="UI.Common.Attrs">
-  <xsd:attribute name="appearance" type="xforms:appearanceType" use="optional"/>
- </xsd:attributeGroup>
- <xsd:group name="UI.Inline">
-  <xsd:sequence>
-   <xsd:choice minOccurs="0">
-    <xsd:element ref="xforms:output"/>
-    <!-- containing document language to add additional allowed content here -->
-   </xsd:choice>
-  </xsd:sequence>
- </xsd:group>
- <xsd:element name="label">
-  <xsd:complexType mixed="true">
-   <xsd:group ref="xforms:UI.Inline"/>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Linking.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="hint">
-  <xsd:complexType mixed="true">
-   <xsd:group ref="xforms:UI.Inline"/>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Linking.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="help">
-  <xsd:complexType mixed="true">
-   <xsd:group ref="xforms:UI.Inline"/>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Linking.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="alert">
-  <xsd:complexType mixed="true">
-   <xsd:group ref="xforms:UI.Inline"/>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Linking.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="extension">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:any namespace="##other"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="choices">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label" minOccurs="0"/>
-    <xsd:sequence maxOccurs="unbounded">
-     <xsd:choice>
-      <xsd:element ref="xforms:choices"/>
-      <xsd:element ref="xforms:item"/>
-      <xsd:element ref="xforms:itemset"/>
-     </xsd:choice>
-    </xsd:sequence>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="value">
-  <xsd:complexType mixed="true">
-   <xsd:sequence>
-    <xsd:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="item">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:element ref="xforms:value"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="itemset">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:choice>
-     <xsd:element ref="xforms:value"/>
-     <xsd:element ref="xforms:copy"/>
-    </xsd:choice>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="copy">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="filename">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="mediatype">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:group name="UI.Common">
-  <xsd:sequence>
-   <xsd:choice minOccurs="0" maxOccurs="unbounded">
-    <xsd:element ref="xforms:help"/>
-    <xsd:element ref="xforms:hint"/>
-    <xsd:element ref="xforms:alert"/>
-    <xsd:group ref="xforms:Action"/>
-   </xsd:choice>
-  </xsd:sequence>
- </xsd:group>
- <xsd:element name="input">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attribute name="inputmode" type="xsd:string" use="optional"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="textarea">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attribute name="inputmode" type="xsd:string" use="optional"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="secret">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attribute name="inputmode" type="xsd:string" use="optional"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="upload">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:element ref="xforms:filename" minOccurs="0"/>
-    <xsd:element ref="xforms:mediatype" minOccurs="0"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="mediatype" type="xsd:string" use="optional"/>
-   <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:group name="List.UI.Common">
-  <xsd:sequence>
-   <xsd:choice>
-    <xsd:element ref="xforms:item"/>
-    <xsd:element ref="xforms:itemset"/>
-    <xsd:element ref="xforms:choices"/>
-   </xsd:choice>
-  </xsd:sequence>
- </xsd:group>
- <xsd:element name="select1">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:List.UI.Common" maxOccurs="unbounded"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="selection" use="optional" default="closed">
-    <xsd:simpleType>
-     <xsd:restriction base="xsd:string">
-      <xsd:enumeration value="open"/>
-      <xsd:enumeration value="closed"/>
-     </xsd:restriction>
-    </xsd:simpleType>
-   </xsd:attribute>
-   <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="true"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="select">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:List.UI.Common" maxOccurs="unbounded"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="selection" use="optional" default="closed">
-    <xsd:simpleType>
-     <xsd:restriction base="xsd:string">
-      <xsd:enumeration value="open"/>
-      <xsd:enumeration value="closed"/>
-     </xsd:restriction>
-    </xsd:simpleType>
-   </xsd:attribute>
-   <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="true"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="range">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="start" type="xsd:string" use="optional"/>
-   <xsd:attribute name="end" type="xsd:string" use="optional"/>
-   <xsd:attribute name="step" type="xsd:string" use="optional"/>
-   <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="trigger">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="output">
-  <xsd:complexType>
-   <xsd:sequence minOccurs="0">
-    <xsd:element ref="xforms:label"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attribute name="appearance" type="xforms:appearanceType" use="optional"/>
-   <xsd:attribute name="value" type="xforms:XPathExpression" use="optional"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="submit">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label"/>
-    <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="submission" type="xsd:IDREF" use="required"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-  </xsd:complexType>
- </xsd:element>
- <!--
-XForms Actions
--->
- <xsd:attributeGroup name="XML.Events">
-  <xsd:attribute ref="ev:event"/>
-  <xsd:attribute ref="ev:observer"/>
-  <xsd:attribute ref="ev:target"/>
-  <xsd:attribute ref="ev:handler"/>
-  <xsd:attribute ref="ev:phase"/>
-  <xsd:attribute ref="ev:propagate"/>
-  <xsd:attribute ref="ev:defaultAction"/>
- </xsd:attributeGroup>
- <xsd:group name="Action">
-  <xsd:sequence>
-   <xsd:choice minOccurs="0" maxOccurs="unbounded">
-    <xsd:element ref="xforms:action"/>
-    <xsd:element ref="xforms:dispatch"/>
-    <xsd:element ref="xforms:rebuild"/>
-    <xsd:element ref="xforms:recalculate"/>
-    <xsd:element ref="xforms:revalidate"/>
-    <xsd:element ref="xforms:refresh"/>
-    <xsd:element ref="xforms:setfocus"/>
-    <xsd:element ref="xforms:load"/>
-    <xsd:element ref="xforms:setvalue"/>
-    <xsd:element ref="xforms:send"/>
-    <xsd:element ref="xforms:reset"/>
-    <xsd:element ref="xforms:insert"/>
-    <xsd:element ref="xforms:delete"/>
-    <xsd:element ref="xforms:setindex"/>
-    <xsd:element ref="xforms:toggle"/>
-    <xsd:element ref="xforms:message"/>
-   </xsd:choice>
-  </xsd:sequence>
- </xsd:group>
- <xsd:element name="action">
-  <xsd:complexType>
-   <xsd:sequence maxOccurs="unbounded">
-    <xsd:group ref="xforms:Action"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="dispatch">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="name" type="xsd:NMTOKEN" use="required"/>
-   <xsd:attribute name="target" type="xsd:IDREF" use="required"/>
-   <xsd:attribute name="bubbles" type="xsd:boolean" use="optional" default="true"/>
-   <xsd:attribute name="cancelable" type="xsd:boolean" use="optional" default="true"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="rebuild">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-   <!-- E4 -->
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="revalidate">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-   <!-- E4 -->
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="recalculate">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-   <!-- E4 -->
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="refresh">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-   <!-- E4 -->
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="setfocus">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="control" type="xsd:IDREF" use="required"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="load">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attribute name="resource" type="xsd:anyURI"/>
-   <xsd:attribute name="show" use="optional" default="replace">
-    <xsd:simpleType>
-     <xsd:restriction base="xsd:string">
-      <xsd:enumeration value="new"/>
-      <xsd:enumeration value="replace"/>
-     </xsd:restriction>
-    </xsd:simpleType>
-    <!-- E22 -->
-   </xsd:attribute>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="setvalue">
-  <xsd:complexType>
-   <xsd:simpleContent>
-    <xsd:extension base="xsd:string">
-     <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-     <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-     <xsd:attribute name="value" type="xforms:XPathExpression" use="optional"/>
-     <xsd:attributeGroup ref="xforms:XML.Events"/>
-    </xsd:extension>
-   </xsd:simpleContent>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="send">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="submission" type="xsd:IDREF" use="required"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="reset">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-   <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
-   <!-- E4 -->
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="insert">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
-   <xsd:attribute name="at" type="xforms:XPathExpression" use="required"/>
-   <xsd:attribute name="position" use="required">
-    <xsd:simpleType>
-     <xsd:restriction base="xsd:string">
-      <xsd:enumeration value="before"/>
-      <xsd:enumeration value="after"/>
-     </xsd:restriction>
-    </xsd:simpleType>
-   </xsd:attribute>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="delete">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
-   <xsd:attribute name="at" type="xforms:XPathExpression" use="required"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="setindex">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="repeat" type="xsd:IDREF" use="required"/>
-   <xsd:attribute name="index" type="xforms:XPathExpression" use="required"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="toggle">
-  <xsd:complexType>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attribute name="case" type="xsd:IDREF" use="required"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="message">
-  <xsd:complexType mixed="true">
-   <xsd:group ref="xforms:UI.Inline"/>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attribute name="level" use="required">
-    <xsd:simpleType>
-     <xsd:union memberTypes="xforms:QNameButNotNCNAME">
-      <xsd:simpleType>
-       <xsd:restriction base="xsd:string">
-        <xsd:enumeration value="ephemeral"/>
-        <xsd:enumeration value="modeless"/>
-        <xsd:enumeration value="modal"/>
-       </xsd:restriction>
-      </xsd:simpleType>
-     </xsd:union>
-    </xsd:simpleType>
-   </xsd:attribute>
-   <xsd:attributeGroup ref="xforms:Linking.Attributes"/>
-   <xsd:attributeGroup ref="xforms:XML.Events"/>
-  </xsd:complexType>
- </xsd:element>
- <!--
-Advanced User Interface
--->
- <xsd:attribute name="repeat-nodeset" type="xforms:XPathExpression"/>
- <xsd:attribute name="repeat-model" type="xsd:IDREF"/>
- <xsd:attribute name="repeat-bind" type="xsd:IDREF"/>
- <xsd:attribute name="repeat-startindex" type="xsd:positiveInteger"/>
- <xsd:attribute name="repeat-number" type="xsd:nonNegativeInteger"/>
- <xsd:element name="repeat">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
-     <xsd:choice>
-      <xsd:group ref="xforms:Form.Controls"/>
-      <xsd:element ref="xforms:group"/>
-      <xsd:element ref="xforms:switch"/>
-      <xsd:element ref="xforms:repeat"/>
-      <!-- containing document language to add additional allowed content here -->
-     </xsd:choice>
-    </xsd:sequence>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-   <xsd:attribute name="startindex" type="xsd:positiveInteger"/>
-   <xsd:attribute name="number" type="xsd:nonNegativeInteger"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="group">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label" minOccurs="0"/>
-    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
-     <xsd:choice>
-      <xsd:group ref="xforms:UI.Common"/>
-      <xsd:group ref="xforms:Form.Controls"/>
-      <xsd:element ref="xforms:group"/>
-      <xsd:element ref="xforms:switch"/>
-      <xsd:element ref="xforms:repeat"/>
-      <!-- containing document language to add additional allowed content here -->
-     </xsd:choice>
-    </xsd:sequence>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="switch">
-  <xsd:complexType>
-   <xsd:sequence maxOccurs="unbounded">
-    <xsd:element ref="xforms:case"/>
-   </xsd:sequence>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-   <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
-   <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
-  </xsd:complexType>
- </xsd:element>
- <xsd:element name="case">
-  <xsd:complexType>
-   <xsd:sequence>
-    <xsd:element ref="xforms:label" minOccurs="0"/>
-    <xsd:sequence minOccurs="0" maxOccurs="unbounded">
-     <xsd:choice>
-      <xsd:group ref="xforms:Form.Controls"/>
-      <xsd:group ref="xforms:Action"/>
-      <xsd:element ref="xforms:group"/>
-      <xsd:element ref="xforms:switch"/>
-      <xsd:element ref="xforms:repeat"/>
-      <!-- containing document language to add additional allowed content here -->
-     </xsd:choice>
-     <!-- E71 -->
-    </xsd:sequence>
-   </xsd:sequence>
-   <xsd:attribute name="selected" type="xsd:boolean" use="optional" default="false"/>
-   <xsd:attributeGroup ref="xforms:Common.Attributes"/>
-  </xsd:complexType>
- </xsd:element>
- <!--
-New simpleTypes
--->
-
- <xsd:simpleType name="versionList">
-  <xsd:list itemType="xforms:versionNumber"/>
- </xsd:simpleType>
- <xsd:simpleType name="versionNumber">
-  <xsd:restriction base="xsd:string">
-   <xsd:pattern value="[1-9]\d*\.\d+"/>
-  </xsd:restriction>
- </xsd:simpleType>
- <xsd:simpleType name="XPathExpression">
-  <xsd:restriction base="xsd:string"/>
- </xsd:simpleType>
- <xsd:simpleType name="QNameList">
-  <xsd:list itemType="xsd:QName"/>
- </xsd:simpleType>
- <xsd:simpleType name="anyURIList">
-  <xsd:list itemType="xsd:anyURI"/>
- </xsd:simpleType>
- <xsd:simpleType name="QNameButNotNCNAME">
-  <xsd:restriction base="xsd:QName">
-   <xsd:pattern value="[^:]+:[^:]+"/>
-  </xsd:restriction>
- </xsd:simpleType>
- <xsd:simpleType name="appearanceType">
-  <xsd:union memberTypes="xforms:QNameButNotNCNAME">
-   <xsd:simpleType>
-    <xsd:restriction base="xsd:string">
-     <xsd:enumeration value="full"/>
-     <xsd:enumeration value="compact"/>
-     <xsd:enumeration value="minimal"/>
-    </xsd:restriction>
-   </xsd:simpleType>
-  </xsd:union>
- </xsd:simpleType>
- <xsd:simpleType name="listItem">
-  <xsd:restriction base="xsd:string">
-   <xsd:pattern value="\S+"/>
-  </xsd:restriction>
- </xsd:simpleType>
- <xsd:simpleType name="listItems">
-  <xsd:list itemType="xforms:listItem"/>
- </xsd:simpleType>
- <xsd:simpleType name="dayTimeDuration">
-  <xsd:restriction base="xsd:duration">
-   <xsd:pattern value="[\-]?P([0-9]+D(T([0-9]+(H([0-9]+(M([0-9]+(\.[0-9]*)?S
-               |\.[0-9]+S)?|(\.[0-9]*)?S)|(\.[0-9]*)?S)?|M([0-9]+
-               (\.[0-9]*)?S|\.[0-9]+S)?|(\.[0-9]*)?S)|\.[0-9]+S))?
-               |T([0-9]+(H([0-9]+(M([0-9]+(\.[0-9]*)?S|\.[0-9]+S)?
-               |(\.[0-9]*)?S)|(\.[0-9]*)?S)?|M([0-9]+(\.[0-9]*)?S|\.[0-9]+S)?
-               |(\.[0-9]*)?S)|\.[0-9]+S))"/>
-  </xsd:restriction>
- </xsd:simpleType>
- <xsd:simpleType name="yearMonthDuration">
-  <xsd:restriction base="xsd:duration">
-   <xsd:pattern value="[\-]?P[0-9]+(Y([0-9]+M)?|M)"/>
-  </xsd:restriction>
- </xsd:simpleType>
-</xsd:schema>
diff --git a/knowledge/pom.xml b/knowledge/pom.xml
deleted file mode 100644 (file)
index 6a0890e..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>knowledge</artifactId>
-       <name>Argeo Knowledge Components</name>
-       <packaging>pom</packaging>
-       <modules>
-               <module>org.argeo.support.xforms</module>
-               <module>org.argeo.support.odk</module>
-               <module>org.argeo.support.geonames</module>
-       </modules>
-</project>
diff --git a/lib/.gitignore b/lib/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/lib/pom.xml b/lib/pom.xml
deleted file mode 100644 (file)
index c539290..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.maven</groupId>
-               <artifactId>argeo-osgi-parent</artifactId>
-               <version>2.1.3</version>
-       </parent>
-       <groupId>org.argeo.suite</groupId>
-       <artifactId>argeo-suite-lib</artifactId>
-       <packaging>pom</packaging>
-       <name>Parent POM for Argeo Suite Extensions</name>
-       <description />
-       <version>2.3.1-SNAPSHOT</version>
-       <properties>
-               <!-- Dependencies -->
-               <version.argeo-tp>2.1.27</version.argeo-tp>
-               <version.argeo-tp-extras>2.1.13</version.argeo-tp-extras>
-               <version.argeo-commons>[2.1.102,2.3.0-SNAPSHOT)</version.argeo-commons>
-               <version.argeo-suite-icons>[2.1.1,2.3.0-SNAPSHOT)</version.argeo-suite-icons>
-
-               <argeo.rpm.stagingRepository>/srv/rpmfactory/unstable/argeo</argeo.rpm.stagingRepository>
-               <git.rw />
-       </properties>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.tp.equinox</groupId>
-                       <artifactId>org.eclipse.osgi</artifactId>
-                       <scope>provided</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.dep.ui.rap</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-                       <scope>provided</scope>
-                       <exclusions>
-                               <!-- Avoid slf4j implementations lurking in the classpath. -->
-                               <exclusion>
-                                       <groupId>org.argeo.tp.sdk</groupId>
-                                       <artifactId>biz.aQute.bndlib</artifactId>
-                               </exclusion>
-                               <exclusion>
-                                       <groupId>org.argeo.tp.misc</groupId>
-                                       <artifactId>slf4j.osgi</artifactId>
-                               </exclusion>
-                       </exclusions>
-               </dependency>
-
-               <!-- SDK -->
-               <dependency>
-                       <groupId>org.argeo.tp.sdk</groupId>
-                       <artifactId>org.junit</artifactId>
-                       <scope>test</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.sdk</groupId>
-                       <artifactId>org.hamcrest</artifactId>
-                       <scope>test</scope>
-               </dependency>
-       </dependencies>
-       <dependencyManagement>
-               <dependencies>
-                       <dependency>
-                               <groupId>org.argeo.tp</groupId>
-                               <artifactId>argeo-tp</artifactId>
-                               <version>${version.argeo-tp}</version>
-                               <type>pom</type>
-                               <scope>import</scope>
-                       </dependency>
-                       <dependency>
-                               <groupId>org.argeo.tp</groupId>
-                               <artifactId>argeo-tp-rap-e4</artifactId>
-                               <version>${version.argeo-tp}</version>
-                               <type>pom</type>
-                               <scope>import</scope>
-                       </dependency>
-               </dependencies>
-       </dependencyManagement>
-       <repositories>
-               <repository>
-                       <id>argeo</id>
-                       <url>http://forge.argeo.org/data/java/argeo-2.1</url>
-                       <releases>
-                               <enabled>true</enabled>
-                               <updatePolicy>daily</updatePolicy>
-                               <checksumPolicy>warn</checksumPolicy>
-                       </releases>
-                       <snapshots>
-                               <enabled>false</enabled>
-                       </snapshots>
-               </repository>
-               <repository>
-                       <id>argeo-unstable</id>
-                       <url>http://forge.argeo.org/data/java/argeo-2.3/</url>
-                       <releases>
-                               <enabled>true</enabled>
-                               <updatePolicy>never</updatePolicy>
-                               <checksumPolicy>warn</checksumPolicy>
-                       </releases>
-                       <snapshots>
-                               <enabled>false</enabled>
-                       </snapshots>
-               </repository>
-       </repositories>
-       <reporting>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-project-info-reports-plugin</artifactId>
-                               <version>2.9</version>
-                               <reportSets>
-                                       <reportSet>
-                                               <reports>
-                                                       <report>index</report>
-                                                       <report>summary</report>
-                                                       <report>license</report>
-                                                       <report>scm</report>
-                                               </reports>
-                                       </reportSet>
-                               </reportSets>
-                       </plugin>
-                       <plugin>
-                               <artifactId>maven-javadoc-plugin</artifactId>
-                               <version>3.0.0</version>
-                               <configuration>
-                                       <failOnError>false</failOnError>
-                                       <additionalJOption>-Xdoclint:none</additionalJOption>
-                                       <excludePackageNames>*.internal.*,org.eclipse.*</excludePackageNames>
-                                       <encoding>UTF-8</encoding>
-                                       <detectLinks>true</detectLinks>
-                                       <links>
-                                               <link>http://docs.oracle.com/javase/8/docs/api</link>
-                                               <link>https://osgi.org/javadoc/r5/core</link>
-                                               <link>https://osgi.org/javadoc/r5/enterprise</link>
-                                               <link>https://docs.adobe.com/docs/en/spec/javax.jcr/javadocs/jcr-2.0</link>
-                                               <link>http://help.eclipse.org/oxygen/topic/org.eclipse.platform.doc.isv/reference/api</link>
-                                               <link>http://docs.spring.io/spring/docs/3.2.x/javadoc-api</link>
-                                       </links>
-                               </configuration>
-                               <reportSets>
-                                       <reportSet>
-                                               <id>aggregate-javadoc</id>
-                                               <inherited>false</inherited>
-                                               <reports>
-                                                       <report>aggregate</report>
-                                               </reports>
-                                       </reportSet>
-                                       <reportSet>
-                                               <id>javadoc</id>
-                                               <reports />
-                                       </reportSet>
-                               </reportSets>
-                       </plugin>
-                       <plugin>
-                               <artifactId>maven-jxr-plugin</artifactId>
-                               <version>2.5</version>
-                               <reportSets>
-                                       <reportSet>
-                                               <id>aggregate-jxr</id>
-                                               <inherited>false</inherited>
-                                               <reports>
-                                                       <report>aggregate</report>
-                                               </reports>
-                                       </reportSet>
-                                       <reportSet>
-                                               <id>jxr</id>
-                                               <reports />
-                                       </reportSet>
-                               </reportSets>
-                       </plugin>
-               </plugins>
-       </reporting>
-</project>
diff --git a/library/.gitignore b/library/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/library/org.argeo.library.ui/.classpath b/library/org.argeo.library.ui/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/library/org.argeo.library.ui/.gitignore b/library/org.argeo.library.ui/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/library/org.argeo.library.ui/.project b/library/org.argeo.library.ui/.project
deleted file mode 100644 (file)
index 6aa2010..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.library.ui</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/library/org.argeo.library.ui/META-INF/.gitignore b/library/org.argeo.library.ui/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/library/org.argeo.library.ui/OSGI-INF/contentEntryArea.xml b/library/org.argeo.library.ui/OSGI-INF/contentEntryArea.xml
deleted file mode 100644 (file)
index 0b5646e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-   <implementation class="org.argeo.library.ui.ContentEntryArea"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/contentEntryArea.properties"/>
-</scr:component>
diff --git a/library/org.argeo.library.ui/OSGI-INF/contentLayer.xml b/library/org.argeo.library.ui/OSGI-INF/contentLayer.xml
deleted file mode 100644 (file)
index 0dae1af..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-   <implementation class="org.argeo.suite.ui.DefaultEditionLayer"/>
-   <service>
-      <provide interface="org.argeo.suite.ui.SuiteLayer"/>
-   </service>
-   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.library.ui.contentEntryArea)"/>
-   <properties entry="config/contentLayer.properties"/>
-</scr:component>
diff --git a/library/org.argeo.library.ui/OSGI-INF/documentsFolder.xml b/library/org.argeo.library.ui/OSGI-INF/documentsFolder.xml
deleted file mode 100644 (file)
index d7d71f0..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Documents Folder">
-   <implementation class="org.argeo.library.ui.DocumentsFolderUiProvider"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/documentsFolder.properties"/>
-   <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
-</scr:component>
diff --git a/library/org.argeo.library.ui/OSGI-INF/fsEntryArea.xml b/library/org.argeo.library.ui/OSGI-INF/fsEntryArea.xml
deleted file mode 100644 (file)
index 540f4ff..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-   <implementation class="org.argeo.library.ui.DocumentsTreeUiProvider"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/contentEntryArea.properties"/>
-   <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
-</scr:component>
diff --git a/library/org.argeo.library.ui/OSGI-INF/l10n/bundle.properties b/library/org.argeo.library.ui/OSGI-INF/l10n/bundle.properties
deleted file mode 100644 (file)
index 8015421..0000000
+++ /dev/null
@@ -1 +0,0 @@
-content=content
diff --git a/library/org.argeo.library.ui/bnd.bnd b/library/org.argeo.library.ui/bnd.bnd
deleted file mode 100644 (file)
index 71f4618..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Service-Component:\
-OSGI-INF/contentEntryArea.xml,\
-OSGI-INF/fsEntryArea.xml,\
-OSGI-INF/contentLayer.xml,\
-OSGI-INF/documentsFolder.xml
-
-Import-Package:\
-org.eclipse.swt,\
-javax.jcr.nodetype,\
-org.argeo.api,\
-org.argeo.suite.ui,\
-*
\ No newline at end of file
diff --git a/library/org.argeo.library.ui/build.properties b/library/org.argeo.library.ui/build.properties
deleted file mode 100644 (file)
index 0859c52..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/,\
-               OSGI-INF/contentLayer.xml,\
-               OSGI-INF/documentsFolder.xml
-source.. = src/
diff --git a/library/org.argeo.library.ui/config/contentEntryArea.properties b/library/org.argeo.library.ui/config/contentEntryArea.properties
deleted file mode 100644 (file)
index 855fe97..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.library.ui.contentEntryArea
diff --git a/library/org.argeo.library.ui/config/contentLayer.properties b/library/org.argeo.library.ui/config/contentLayer.properties
deleted file mode 100644 (file)
index c1ca8e3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-service.pid=argeo.library.ui.contentLayer
-
-title=%content
-icon=documents
-
-entity.type=nt:folder,nt:file,entity:space,entity:document
diff --git a/library/org.argeo.library.ui/config/documentsFolder.properties b/library/org.argeo.library.ui/config/documentsFolder.properties
deleted file mode 100644 (file)
index 349e930..0000000
+++ /dev/null
@@ -1 +0,0 @@
-entity.type=nt:folder
\ No newline at end of file
diff --git a/library/org.argeo.library.ui/config/fsEntryArea.properties b/library/org.argeo.library.ui/config/fsEntryArea.properties
deleted file mode 100644 (file)
index 0bceaf0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.library.ui.fsEntryArea
diff --git a/library/org.argeo.library.ui/pom.xml b/library/org.argeo.library.ui/pom.xml
deleted file mode 100644 (file)
index 048dd4a..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>library</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.library.ui</artifactId>
-       <name>Documents UI</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Eclipse E4 -->
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp-rap-e4</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <type>pom</type>
-                       <scope>provided</scope>
-               </dependency>
-               <!-- Specific -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <scope>provided</scope>
-               </dependency>
-
-       </dependencies>
-</project>
diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/ContentEntryArea.java
deleted file mode 100644 (file)
index 8b884eb..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.argeo.library.ui;
-
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.jcr.query.Query;
-
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-import org.argeo.suite.ui.SuiteEvent;
-import org.argeo.suite.ui.SuiteIcon;
-import org.argeo.suite.ui.widgets.TreeOrSearchArea;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-public class ContentEntryArea implements CmsUiProvider {
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               CmsTheme theme = CmsTheme.getCmsTheme(parent);
-
-               parent.setLayout(new GridLayout());
-               Ui ui = new Ui(parent, SWT.NONE);
-               ui.setLayoutData(CmsUiUtils.fillAll());
-
-               TreeViewerColumn nameCol = new TreeViewerColumn(ui.getTreeViewer(), SWT.NONE);
-               nameCol.getColumn().setWidth(400);
-               nameCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-                               Node node = (Node) element;
-                               return Jcr.getTitle(node);
-                       }
-
-                       @Override
-                       public Image getImage(Object element) {
-                               Node node = (Node) element;
-                               Image icon;
-                               if (Jcr.isNodeType(node, NodeType.NT_FOLDER)) {
-                                       icon = SuiteIcon.folder.getSmallIcon(theme);
-                               } else if (Jcr.isNodeType(node, NodeType.NT_FILE)) {
-                                       // TODO check recognized document types
-                                       icon = SuiteIcon.document.getSmallIcon(theme);
-                               } else if (Jcr.isNodeType(node, EntityType.document.get())) {
-                                       icon = SuiteIcon.document.getSmallIcon(theme);
-                               } else {
-                                       if (!isLeaf(node))
-                                               icon = SuiteIcon.folder.getSmallIcon(theme);
-                                       else
-                                               icon = null;
-                               }
-                               return icon;
-                       }
-
-               });
-
-               ui.getTreeViewer().addDoubleClickListener(new IDoubleClickListener() {
-
-                       @Override
-                       public void doubleClick(DoubleClickEvent event) {
-                               Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
-                               if (user != null) {
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
-                                                       SuiteEvent.eventProperties(user));
-                               }
-
-                       }
-               });
-               ui.getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() {
-                       public void selectionChanged(SelectionChangedEvent event) {
-                               Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
-                               if (user != null) {
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
-                                                       SuiteEvent.eventProperties(user));
-                               }
-                       }
-               });
-
-               ui.getTreeViewer().setContentProvider(new SpacesContentProvider());
-               ui.getTreeViewer().setInput(context.getSession());
-               return ui;
-       }
-
-       protected boolean isLeaf(Node node) {
-               return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, EntityType.document.get())
-                               || Jcr.isNodeType(node, NodeType.NT_FILE);
-       }
-
-       class Ui extends TreeOrSearchArea {
-
-               public Ui(Composite parent, int style) {
-                       super(parent, style);
-               }
-
-       }
-
-       class SpacesContentProvider implements ITreeContentProvider {
-
-               @Override
-               public Object[] getElements(Object inputElement) {
-                       Session session = (Session) inputElement;
-                       try {
-                               Query query = session.getWorkspace().getQueryManager()
-                                               .createQuery("SELECT * FROM [" + EntityType.space.get() + "]", Query.JCR_SQL2);
-                               NodeIterator spacesIt = query.execute().getNodes();
-                               SortedMap<String, Node> map = new TreeMap<>();
-                               while (spacesIt.hasNext()) {
-                                       Node space = spacesIt.nextNode();
-                                       String path = space.getPath();
-                                       map.put(path, space);
-                               }
-                               return map.values().toArray();
-                       } catch (RepositoryException e) {
-                               throw new JcrException(e);
-                       }
-               }
-
-               @Override
-               public Object[] getChildren(Object parentElement) {
-                       Node parent = (Node) parentElement;
-                       if (isLeaf(parent))
-                               return null;
-                       return Jcr.getNodes(parent).toArray();
-               }
-
-               @Override
-               public Object getParent(Object element) {
-                       Node node = (Node) element;
-                       return Jcr.getParent(node);
-               }
-
-               @Override
-               public boolean hasChildren(Object element) {
-                       Node node = (Node) element;
-                       return !isLeaf(node);
-               }
-
-               @Override
-               public void dispose() {
-               }
-
-               @Override
-               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-               }
-
-       }
-
-}
diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsContextMenu.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsContextMenu.java
deleted file mode 100644 (file)
index 03de251..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-package org.argeo.library.ui;
-
-import static org.argeo.library.ui.DocumentsUiService.ACTION_ID_BOOKMARK_FOLDER;
-import static org.argeo.library.ui.DocumentsUiService.ACTION_ID_CREATE_FOLDER;
-import static org.argeo.library.ui.DocumentsUiService.ACTION_ID_DELETE;
-import static org.argeo.library.ui.DocumentsUiService.ACTION_ID_DOWNLOAD_FOLDER;
-import static org.argeo.library.ui.DocumentsUiService.ACTION_ID_RENAME;
-import static org.argeo.library.ui.DocumentsUiService.ACTION_ID_SHARE_FOLDER;
-import static org.argeo.library.ui.DocumentsUiService.ACTION_ID_UPLOAD_FILE;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-import org.argeo.suite.ui.widgets.AbstractConnectContextMenu;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-
-/** Generic popup context menu to manage NIO Path in a Viewer. */
-public class DocumentsContextMenu extends AbstractConnectContextMenu {
-       // Local context
-       private final DocumentsFolderComposite browser;
-       private final DocumentsUiService uiService;
-//     private final Repository repository;
-
-       private final static String[] DEFAULT_ACTIONS = { ACTION_ID_CREATE_FOLDER, ACTION_ID_BOOKMARK_FOLDER,
-                       ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME,
-                       ACTION_ID_DELETE };
-
-       private Path currFolderPath;
-
-       public DocumentsContextMenu(DocumentsFolderComposite browser,
-                       DocumentsUiService documentsUiService) {
-               super(browser.getDisplay(), DEFAULT_ACTIONS);
-               this.browser = browser;
-               this.uiService = documentsUiService;
-//             this.repository = repository;
-
-               createControl();
-       }
-
-       public void setCurrFolderPath(Path currFolderPath) {
-               this.currFolderPath = currFolderPath;
-       }
-
-       protected boolean aboutToShow(Control source, Point location, IStructuredSelection selection) {
-               boolean emptySel = true;
-               boolean multiSel = false;
-               boolean isFolder = true;
-               if (selection != null && !selection.isEmpty()) {
-                       emptySel = false;
-                       multiSel = selection.size() > 1;
-                       if (!multiSel && selection.getFirstElement() instanceof Path) {
-                               isFolder = Files.isDirectory((Path) selection.getFirstElement());
-                       }
-               }
-               if (emptySel) {
-                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_BOOKMARK_FOLDER);
-                       setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_RENAME, ACTION_ID_DELETE
-                               );
-               } else if (multiSel) {
-                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_DELETE,
-                                       ACTION_ID_BOOKMARK_FOLDER);
-                       setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_RENAME);
-               } else if (isFolder) {
-                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME, ACTION_ID_DELETE,
-                                       ACTION_ID_BOOKMARK_FOLDER);
-                       setVisible(false, 
-                                       // to be implemented
-                                       ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER);
-               } else {
-                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME,
-                                       ACTION_ID_DELETE);
-                       setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_BOOKMARK_FOLDER);
-               }
-               return true;
-       }
-
-       public void show(Control source, Point location, IStructuredSelection selection, Path currFolderPath) {
-               // TODO find a better way to retrieve the parent path (cannot be deduced
-               // from table content because it will fail on an empty folder)
-               this.currFolderPath = currFolderPath;
-               super.show(source, location, selection);
-
-       }
-
-       @Override
-       protected boolean performAction(String actionId) {
-               switch (actionId) {
-               case ACTION_ID_CREATE_FOLDER:
-                       createFolder();
-                       break;
-               case ACTION_ID_BOOKMARK_FOLDER:
-                       bookmarkFolder();
-                       break;
-               case ACTION_ID_RENAME:
-                       renameItem();
-                       break;
-               case ACTION_ID_DELETE:
-                       deleteItems();
-                       break;
-//             case ACTION_ID_OPEN:
-//                     openFile();
-//                     break;
-               case ACTION_ID_UPLOAD_FILE:
-                       uploadFiles();
-                       break;
-               default:
-                       throw new IllegalArgumentException("Unimplemented action " + actionId);
-                       // case ACTION_ID_SHARE_FOLDER:
-                       // return "Share Folder";
-                       // case ACTION_ID_DOWNLOAD_FOLDER:
-                       // return "Download as zip archive";
-               }
-               browser.setFocus();
-               return false;
-       }
-
-       @Override
-       protected String getLabel(String actionId) {
-               return uiService.getLabel(actionId);
-       }
-
-       private void openFile() {
-               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
-               if (selection.isEmpty() || selection.size() > 1)
-                       // Should never happen
-                       return;
-               Path toOpenPath = ((Path) selection.getFirstElement());
-               uiService.openFile(toOpenPath);
-       }
-
-       private void deleteItems() {
-               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
-               if (selection.isEmpty())
-                       return;
-               else if (uiService.deleteItems(getParentShell(), selection))
-                       browser.refresh();
-       }
-
-       private void renameItem() {
-               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
-               if (selection.isEmpty() || selection.size() > 1)
-                       // Should never happen
-                       return;
-               Path toRenamePath = ((Path) selection.getFirstElement());
-               if (uiService.renameItem(getParentShell(), currFolderPath, toRenamePath))
-                       browser.refresh();
-       }
-
-       private void createFolder() {
-               if (uiService.createFolder(getParentShell(), currFolderPath))
-                       browser.refresh();
-       }
-
-       private void bookmarkFolder() {
-               Path toBookmarkPath = null;
-               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
-               if (selection.isEmpty())
-                       toBookmarkPath = currFolderPath;
-               else if (selection.size() > 1)
-                       toBookmarkPath = currFolderPath;
-               else if (selection.size() == 1) {
-                       Path currSelected = ((Path) selection.getFirstElement());
-                       if (Files.isDirectory(currSelected))
-                               toBookmarkPath = currSelected;
-                       else
-                               return;
-               }
-               //uiService.bookmarkFolder(toBookmarkPath, repository, null);
-       }
-
-       private void uploadFiles() {
-               if (uiService.uploadFiles(getParentShell(), currFolderPath))
-                       browser.refresh();
-       }
-}
diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFileComposite.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFileComposite.java
deleted file mode 100644 (file)
index 10cf3bd..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-package org.argeo.library.ui;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.spi.FileSystemProvider;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.fs.CmsFsUtils;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.eclipse.ui.fs.FsUiUtils;
-import org.argeo.eclipse.ui.specific.UiContext;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * Default Documents file composite: a sashForm with a browser in the middle and
- * meta data at right hand side.
- */
-public class DocumentsFileComposite extends Composite {
-       private static final long serialVersionUID = -7567632342889241793L;
-
-       private final static Log log = LogFactory.getLog(DocumentsFileComposite.class);
-
-       private final Node currentBaseContext;
-
-       // UI Parts for the browser
-       private Composite rightPannelCmp;
-
-       public DocumentsFileComposite(Composite parent, int style, Node context,
-                       FileSystemProvider fsp) {
-               super(parent, style);
-               this.currentBaseContext = context;
-               this.setLayout(EclipseUiUtils.noSpaceGridLayout());
-               SashForm form = new SashForm(this, SWT.HORIZONTAL);
-
-               Composite centerCmp = new Composite(form, SWT.BORDER | SWT.NO_FOCUS);
-               createDisplay(centerCmp);
-
-               rightPannelCmp = new Composite(form, SWT.NO_FOCUS);
-
-               Path path = CmsFsUtils.getPath(fsp, context);
-               setOverviewInput(path);
-               form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               form.setWeights(new int[] { 55, 20 });
-       }
-
-       private void createDisplay(final Composite parent) {
-               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
-               Browser browser = new Browser(parent, SWT.NONE);
-               // browser.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true,
-               // true));
-               browser.setLayoutData(EclipseUiUtils.fillAll());
-               try {
-                       // FIXME make it more robust
-                       String url = CmsUiUtils.getDataUrl(currentBaseContext, UiContext.getHttpRequest());
-                       // FIXME issue with the redirection to https
-                       if (url.startsWith("http://") && !url.startsWith("http://localhost"))
-                               url = "https://" + url.substring("http://".length(), url.length());
-                       if (log.isTraceEnabled())
-                               log.debug("Trying to display " + url);
-                       browser.setUrl(url);
-                       browser.layout(true, true);
-               } catch (RepositoryException re) {
-                       throw new IllegalStateException("Cannot open file at " + currentBaseContext, re);
-               }
-       }
-
-       /**
-        * Recreates the content of the box that displays information about the current
-        * selected Path.
-        */
-       private void setOverviewInput(Path path) {
-               try {
-                       EclipseUiUtils.clear(rightPannelCmp);
-                       rightPannelCmp.setLayout(new GridLayout());
-                       if (path != null) {
-                               // if (isImg(context)) {
-                               // EditableImage image = new Img(parent, RIGHT, context,
-                               // imageWidth);
-                               // image.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER,
-                               // true, false,
-                               // 2, 1));
-                               // }
-
-                               Label contextL = new Label(rightPannelCmp, SWT.NONE);
-                               contextL.setText(path.getFileName().toString());
-                               contextL.setFont(EclipseUiUtils.getBoldFont(rightPannelCmp));
-                               addProperty(rightPannelCmp, "Last modified", Files.getLastModifiedTime(path).toString());
-                               // addProperty(rightPannelCmp, "Owner",
-                               // Files.getOwner(path).getName());
-                               if (Files.isDirectory(path)) {
-                                       addProperty(rightPannelCmp, "Type", "Folder");
-                               } else {
-                                       String mimeType = Files.probeContentType(path);
-                                       if (EclipseUiUtils.isEmpty(mimeType))
-                                               mimeType = "<i>Unknown</i>";
-                                       addProperty(rightPannelCmp, "Type", mimeType);
-                                       addProperty(rightPannelCmp, "Size", FsUiUtils.humanReadableByteCount(Files.size(path), false));
-                               }
-                       }
-                       rightPannelCmp.layout(true, true);
-               } catch (IOException e) {
-                       throw new IllegalStateException("Cannot display details for " + path.toString(), e);
-               }
-       }
-
-       // Simplify UI implementation
-       private void addProperty(Composite parent, String propName, String value) {
-               Label propLbl = new Label(parent, SWT.NONE);
-               //propLbl.setText(ConnectUtils.replaceAmpersand(propName + ": " + value));
-               propLbl.setText(value);
-               //CmsUiUtils.markup(propLbl);
-       }
-}
diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFolderComposite.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFolderComposite.java
deleted file mode 100644 (file)
index a686074..0000000
+++ /dev/null
@@ -1,455 +0,0 @@
-package org.argeo.library.ui;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.FileTime;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.jcr.Node;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.ui.fs.FileDrop;
-import org.argeo.cms.ui.fs.FsStyles;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.ColumnDefinition;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.eclipse.ui.fs.FileIconNameLabelProvider;
-import org.argeo.eclipse.ui.fs.FsTableViewer;
-import org.argeo.eclipse.ui.fs.FsUiConstants;
-import org.argeo.eclipse.ui.fs.FsUiUtils;
-import org.argeo.eclipse.ui.fs.NioFileLabelProvider;
-import org.argeo.eclipse.ui.fs.ParentDir;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Default Documents folder composite: a sashForm layout with a simple table in
- * the middle and an overview at right hand side.
- */
-public class DocumentsFolderComposite extends Composite {
-       private final static Log log = LogFactory.getLog(DocumentsFolderComposite.class);
-       private static final long serialVersionUID = -40347919096946585L;
-
-       private final Node currentBaseContext;
-
-       private final DocumentsUiService documentUiService = new DocumentsUiService();
-
-       // UI Parts for the browser
-       private Composite filterCmp;
-       private Composite breadCrumbCmp;
-       private Text filterTxt;
-       private FsTableViewer directoryDisplayViewer;
-       private Composite rightPanelCmp;
-
-       private DocumentsContextMenu contextMenu;
-       private DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm");
-
-       // Local context
-       private Path initialPath;
-       private Path currentFolder;
-
-       public DocumentsFolderComposite(Composite parent, int style, Node context) {
-               super(parent, style);
-               this.currentBaseContext = context;
-
-               this.setLayout(EclipseUiUtils.noSpaceGridLayout());
-
-               SashForm form = new SashForm(this, SWT.HORIZONTAL);
-
-               Composite centerCmp = new Composite(form, SWT.BORDER | SWT.NO_FOCUS);
-               createDisplay(centerCmp);
-
-               rightPanelCmp = new Composite(form, SWT.NO_FOCUS);
-
-               form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-               form.setWeights(new int[] { 55, 20 });
-       }
-
-       public void populate(Path path) {
-               initialPath = path;
-               directoryDisplayViewer.setInitialPath(initialPath);
-               setInput(path);
-       }
-
-       void refresh() {
-               modifyFilter(false);
-       }
-
-       private void createDisplay(final Composite parent) {
-               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
-
-               // top filter
-               filterCmp = new Composite(parent, SWT.NO_FOCUS);
-               filterCmp.setLayoutData(EclipseUiUtils.fillWidth());
-               RowLayout rl = new RowLayout(SWT.HORIZONTAL);
-               rl.wrap = true;
-               rl.center = true;
-               filterCmp.setLayout(rl);
-               // addFilterPanel(filterCmp);
-
-               // Main display
-               directoryDisplayViewer = new FsTableViewer(parent, SWT.MULTI);
-               List<ColumnDefinition> colDefs = new ArrayList<>();
-               colDefs.add(new ColumnDefinition(new FileIconNameLabelProvider(), " Name", 250));
-               colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_SIZE), "Size", 100));
-//             colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_TYPE), "Type", 150));
-               colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_LAST_MODIFIED),
-                               "Last modified", 400));
-               final Table table = directoryDisplayViewer.configureDefaultTable(colDefs);
-               table.setLayoutData(EclipseUiUtils.fillAll());
-
-               directoryDisplayViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
-                       @Override
-                       public void selectionChanged(SelectionChangedEvent event) {
-                               IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
-                               Path selected = null;
-                               if (selection.isEmpty())
-                                       setSelected(null);
-                               else {
-                                       Object o = selection.getFirstElement();
-                                       if (o instanceof Path)
-                                               selected = (Path) o;
-                                       else if (o instanceof ParentDir)
-                                               selected = ((ParentDir) o).getPath();
-                               }
-                               if (selected != null) {
-                                       // TODO manage multiple selection
-                                       setSelected(selected);
-                               }
-                       }
-               });
-
-               directoryDisplayViewer.addDoubleClickListener(new IDoubleClickListener() {
-                       @Override
-                       public void doubleClick(DoubleClickEvent event) {
-                               IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
-                               Path selected = null;
-                               if (!selection.isEmpty()) {
-                                       Object o = selection.getFirstElement();
-                                       if (o instanceof Path)
-                                               selected = (Path) o;
-                                       else if (o instanceof ParentDir)
-                                               selected = ((ParentDir) o).getPath();
-                               }
-                               if (selected != null) {
-                                       if (Files.isDirectory(selected))
-                                               setInput(selected);
-                                       else
-                                               externalNavigateTo(selected);
-                               }
-                       }
-               });
-
-               // The context menu
-               contextMenu = new DocumentsContextMenu(this,  documentUiService);
-
-               table.addMouseListener(new MouseAdapter() {
-                       private static final long serialVersionUID = 6737579410648595940L;
-
-                       @Override
-                       public void mouseDown(MouseEvent e) {
-                               if (e.button == 3) {
-                                       // contextMenu.setCurrFolderPath(currDisplayedFolder);
-                                       contextMenu.show(table, new Point(e.x, e.y),
-                                                       (IStructuredSelection) directoryDisplayViewer.getSelection(), currentFolder);
-                               }
-                       }
-               });
-
-               FileDrop fileDrop = new FileDrop() {
-
-                       @Override
-                       protected void processFileUpload(InputStream in, String fileName, String contetnType) throws IOException {
-                               Path file = currentFolder.resolve(fileName);
-                               Files.copy(in, file);
-                               refresh();
-                       }
-               };
-               fileDrop.createDropTarget(directoryDisplayViewer.getTable());
-       }
-
-       /**
-        * Overwrite to enable single sourcing between workbench and CMS navigation
-        */
-       protected void externalNavigateTo(Path path) {
-
-       }
-
-       private void addPathElementBtn(Path path) {
-               Button elemBtn = new Button(breadCrumbCmp, SWT.PUSH);
-               String nameStr;
-               if (path.toString().equals("/"))
-                       nameStr = "[jcr:root]";
-               else
-                       nameStr = path.getFileName().toString();
-//             elemBtn.setText(nameStr + " >> ");
-               elemBtn.setText(nameStr);
-               CmsUiUtils.style(elemBtn, FsStyles.BREAD_CRUMB_BTN);
-               elemBtn.addSelectionListener(new SelectionAdapter() {
-                       private static final long serialVersionUID = -4103695476023480651L;
-
-                       @Override
-                       public void widgetSelected(SelectionEvent e) {
-                               setInput(path);
-                       }
-               });
-       }
-
-       public void setInput(Path path) {
-               if (path.equals(currentFolder))
-                       return;
-               // below initial path
-               if (!initialPath.equals(path) && initialPath.startsWith(path))
-                       return;
-               currentFolder = path;
-
-               Path diff = initialPath.relativize(currentFolder);
-
-               for (Control child : filterCmp.getChildren())
-                       if (!child.equals(filterTxt))
-                               child.dispose();
-
-               // Bread crumbs
-               breadCrumbCmp = new Composite(filterCmp, SWT.NO_FOCUS);
-               CmsUiUtils.style(breadCrumbCmp, FsStyles.BREAD_CRUMB_BTN);
-               RowLayout breadCrumbLayout = new RowLayout();
-               breadCrumbLayout.spacing = 0;
-               breadCrumbLayout.marginTop = 0;
-               breadCrumbLayout.marginBottom = 0;
-               breadCrumbLayout.marginRight = 0;
-               breadCrumbLayout.marginLeft = 0;
-               breadCrumbCmp.setLayout(breadCrumbLayout);
-               addPathElementBtn(initialPath);
-               Path currTarget = initialPath;
-               if (!diff.toString().equals(""))
-                       for (Path pathElem : diff) {
-                               currTarget = currTarget.resolve(pathElem);
-                               addPathElementBtn(currTarget);
-                       }
-
-               if (filterTxt != null) {
-                       filterTxt.setText("");
-                       filterTxt.moveBelow(null);
-               } else {
-                       modifyFilter(false);
-               }
-               setSelected(null);
-               filterCmp.getParent().layout(true, true);
-       }
-
-       private void setSelected(Path path) {
-               if (path == null)
-                       setOverviewInput(currentFolder);
-               else
-                       setOverviewInput(path);
-       }
-
-       public Viewer getViewer() {
-               return directoryDisplayViewer;
-       }
-
-       /**
-        * Recreates the content of the box that displays information about the current
-        * selected Path.
-        */
-       private void setOverviewInput(Path path) {
-               try {
-                       EclipseUiUtils.clear(rightPanelCmp);
-                       rightPanelCmp.setLayout(new GridLayout());
-                       if (path != null) {
-                               // if (isImg(context)) {
-                               // EditableImage image = new Img(parent, RIGHT, context,
-                               // imageWidth);
-                               // image.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER,
-                               // true, false,
-                               // 2, 1));
-                               // }
-
-                               Label contextL = new Label(rightPanelCmp, SWT.NONE);
-                               contextL.setText(path.getFileName().toString());
-                               contextL.setFont(EclipseUiUtils.getBoldFont(rightPanelCmp));
-                               FileTime lastModified = Files.getLastModifiedTime(path);
-                               if (lastModified.toMillis() != 0)
-                                       try {
-                                               String lastModifiedStr = dateFormat.format(new Date(lastModified.toMillis()));
-                                               addProperty(rightPanelCmp, "Last modified", lastModifiedStr);
-                                       } catch (Exception e) {
-                                               log.error("Workarounded issue while getting last update date for " + path, e);
-                                               addProperty(rightPanelCmp, "Last modified", "-");
-                                       }
-                               // addProperty(rightPannelCmp, "Owner",
-                               // Files.getOwner(path).getName());
-                               if (Files.isDirectory(path)) {
-                                       addProperty(rightPanelCmp, "Type", "Folder");
-                               } else {
-                                       String mimeType = Files.probeContentType(path);
-                                       if (EclipseUiUtils.isEmpty(mimeType))
-                                               mimeType = "<i>Unknown</i>";
-                                       addProperty(rightPanelCmp, "Type", mimeType);
-                                       addProperty(rightPanelCmp, "Size", FsUiUtils.humanReadableByteCount(Files.size(path), false));
-                               }
-
-                               // read all attributes
-//                             Map<String, Object> attrs = Files.readAttributes(path, "*");
-//                             for (String attr : attrs.keySet()) {
-//                                     Object value = attrs.get(attr);
-//                                     String str;
-//                                     if (value instanceof Calendar) {
-//                                             str = dateFormat.format(((Calendar) value).getTime());
-//                                     } else {
-//                                             str = value.toString();
-//                                     }
-//                                     addProperty(rightPanelCmp, attr, str);
-//
-//                             }
-                       }
-                       rightPanelCmp.layout(true, true);
-               } catch (IOException e) {
-                       throw new IllegalStateException("Cannot display details for " + path.toString(), e);
-               }
-       }
-
-       private void addFilterPanel(Composite parent) {
-               // parent.setLayout(EclipseUiUtils.noSpaceGridLayout(new GridLayout(2,
-               // false)));
-
-               filterTxt = new Text(parent, SWT.SEARCH | SWT.ICON_CANCEL);
-               filterTxt.setMessage("Search current folder");
-               filterTxt.setLayoutData(new RowData(250, SWT.DEFAULT));
-               filterTxt.addModifyListener(new ModifyListener() {
-                       private static final long serialVersionUID = 1L;
-
-                       public void modifyText(ModifyEvent event) {
-                               modifyFilter(false);
-                       }
-               });
-               filterTxt.addKeyListener(new KeyListener() {
-                       private static final long serialVersionUID = 2533535233583035527L;
-
-                       @Override
-                       public void keyReleased(KeyEvent e) {
-                       }
-
-                       @Override
-                       public void keyPressed(KeyEvent e) {
-                               // boolean shiftPressed = (e.stateMask & SWT.SHIFT) != 0;
-                               // // boolean altPressed = (e.stateMask & SWT.ALT) != 0;
-                               // FilterEntitiesVirtualTable currTable = null;
-                               // if (currEdited != null) {
-                               // FilterEntitiesVirtualTable table =
-                               // browserCols.get(currEdited);
-                               // if (table != null && !table.isDisposed())
-                               // currTable = table;
-                               // }
-                               //
-                               // if (e.keyCode == SWT.ARROW_DOWN)
-                               // currTable.setFocus();
-                               // else if (e.keyCode == SWT.BS) {
-                               // if (filterTxt.getText().equals("")
-                               // && !(currEdited.getNameCount() == 1 ||
-                               // currEdited.equals(initialPath))) {
-                               // Path oldEdited = currEdited;
-                               // Path parentPath = currEdited.getParent();
-                               // setEdited(parentPath);
-                               // if (browserCols.containsKey(parentPath))
-                               // browserCols.get(parentPath).setSelected(oldEdited);
-                               // filterTxt.setFocus();
-                               // e.doit = false;
-                               // }
-                               // } else if (e.keyCode == SWT.TAB && !shiftPressed) {
-                               // Path uniqueChild = getOnlyChild(currEdited,
-                               // filterTxt.getText());
-                               // if (uniqueChild != null) {
-                               // // Highlight the unique chosen child
-                               // currTable.setSelected(uniqueChild);
-                               // setEdited(uniqueChild);
-                               // }
-                               // filterTxt.setFocus();
-                               // e.doit = false;
-                               // }
-                       }
-               });
-       }
-
-       // private Path getOnlyChild(Path parent, String filter) {
-       // try (DirectoryStream<Path> stream =
-       // Files.newDirectoryStream(currDisplayedFolder, filter + "*")) {
-       // Path uniqueChild = null;
-       // boolean moreThanOne = false;
-       // loop: for (Path entry : stream) {
-       // if (uniqueChild == null) {
-       // uniqueChild = entry;
-       // } else {
-       // moreThanOne = true;
-       // break loop;
-       // }
-       // }
-       // if (!moreThanOne)
-       // return uniqueChild;
-       // return null;
-       // } catch (IOException ioe) {
-       // throw new DocumentsException(
-       // "Unable to determine unique child existence and get it under " + parent +
-       // " with filter " + filter,
-       // ioe);
-       // }
-       // }
-
-       private void modifyFilter(boolean fromOutside) {
-               if (!fromOutside)
-                       if (currentFolder != null) {
-                               String filter;
-                               if (filterTxt != null)
-                                       filter = filterTxt.getText() + "*";
-                               else
-                                       filter = "*";
-                               directoryDisplayViewer.setInput(currentFolder, filter);
-                       }
-       }
-
-       // Simplify UI implementation
-       private void addProperty(Composite parent, String propName, String value) {
-               Label propLbl = new Label(parent, SWT.NONE);
-               //propLbl.setText(ConnectUtils.replaceAmpersand(propName + ": " + value));
-               propLbl.setText(value);
-               //CmsUiUtils.markup(propLbl);
-       }
-
-       public Path getCurrentFolder() {
-               return currentFolder;
-       }
-
-}
diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFolderUiProvider.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsFolderUiProvider.java
deleted file mode 100644 (file)
index bdc194b..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.argeo.library.ui;
-
-import java.nio.file.Path;
-import java.nio.file.spi.FileSystemProvider;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.fs.CmsFsUtils;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.jcr.Jcr;
-import org.argeo.suite.ui.SuiteEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** UI provider of a document folder. */
-public class DocumentsFolderUiProvider implements CmsUiProvider {
-       private FileSystemProvider nodeFileSystemProvider;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               CmsView cmsView = CmsView.getCmsView(parent);
-               DocumentsFolderComposite dfc = new DocumentsFolderComposite(parent, SWT.NONE, context) {
-
-                       @Override
-                       protected void externalNavigateTo(Path path) {
-                               Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(Jcr.getSession(context).getRepository(), path));
-                               parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
-                               cmsView.sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.eventProperties(folderNode));
-                       }
-               };
-               dfc.setLayoutData(CmsUiUtils.fillAll());
-               dfc.populate(cmsView.doAs(() -> CmsFsUtils.getPath(nodeFileSystemProvider, context)));
-               return dfc;
-       }
-
-       public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) {
-               this.nodeFileSystemProvider = nodeFileSystemProvider;
-       }
-
-}
diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsTreeUiProvider.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsTreeUiProvider.java
deleted file mode 100644 (file)
index 4660515..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.argeo.library.ui;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.spi.FileSystemProvider;
-
-import javax.jcr.Node;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-
-import org.argeo.api.NodeConstants;
-import org.argeo.api.NodeUtils;
-import org.argeo.cms.fs.CmsFsUtils;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.fs.FsTreeViewer;
-import org.argeo.jcr.Jcr;
-import org.argeo.suite.ui.SuiteEvent;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** Tree view of a user root folders. */
-public class DocumentsTreeUiProvider implements CmsUiProvider {
-       private FileSystemProvider nodeFileSystemProvider;
-       private Repository repository;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               parent.setLayout(new GridLayout());
-               FsTreeViewer fsTreeViewer = new FsTreeViewer(parent, SWT.NONE);
-               fsTreeViewer.configureDefaultSingleColumnTable(500);
-               CmsView cmsView = CmsView.getCmsView(parent);
-               Node homeNode = NodeUtils.getUserHome(cmsView.doAs(() -> Jcr.login(repository, NodeConstants.HOME_WORKSPACE)));
-               parent.addDisposeListener((e1) -> Jcr.logout(homeNode));
-               Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
-               fsTreeViewer.addSelectionChangedListener((e) -> {
-                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
-                       if (selection.isEmpty())
-                               return;
-                       else {
-                               Path newSelected = (Path) selection.getFirstElement();
-                               if (Files.isDirectory(newSelected)) {
-                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
-                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
-                                       cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(folderNode));
-                               }
-                       }
-               });
-               fsTreeViewer.addDoubleClickListener((e) -> {
-                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
-                       if (selection.isEmpty())
-                               return;
-                       else {
-                               Path newSelected = (Path) selection.getFirstElement();
-                               if (Files.isDirectory(newSelected)) {
-                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
-                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
-                                       cmsView.sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.eventProperties(folderNode));
-                               }
-                       }
-               });
-               fsTreeViewer.setPathsInput(homePath);
-               fsTreeViewer.getControl().setLayoutData(CmsUiUtils.fillAll());
-               fsTreeViewer.getControl().getParent().layout(true, true);
-               return fsTreeViewer.getControl();
-       }
-
-       public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) {
-               this.nodeFileSystemProvider = nodeFileSystemProvider;
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-}
diff --git a/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsUiService.java b/library/org.argeo.library.ui/src/org/argeo/library/ui/DocumentsUiService.java
deleted file mode 100644 (file)
index ad13d28..0000000
+++ /dev/null
@@ -1,310 +0,0 @@
-package org.argeo.library.ui;
-
-import static org.argeo.cms.ui.dialogs.CmsMessageDialog.openConfirm;
-import static org.argeo.cms.ui.dialogs.CmsMessageDialog.openError;
-import static org.argeo.cms.ui.dialogs.SingleValueDialog.ask;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Method;
-import java.net.URI;
-import java.nio.file.DirectoryNotEmptyException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.ui.dialogs.CmsFeedback;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.eclipse.ui.specific.OpenFile;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-public class DocumentsUiService {
-       private final static Log log = LogFactory.getLog(DocumentsUiService.class);
-
-       // Default known actions
-       public final static String ACTION_ID_CREATE_FOLDER = "createFolder";
-       public final static String ACTION_ID_BOOKMARK_FOLDER = "bookmarkFolder";
-       public final static String ACTION_ID_SHARE_FOLDER = "shareFolder";
-       public final static String ACTION_ID_DOWNLOAD_FOLDER = "downloadFolder";
-       public final static String ACTION_ID_RENAME = "rename";
-       public final static String ACTION_ID_DELETE = "delete";
-       public final static String ACTION_ID_UPLOAD_FILE = "uploadFiles";
-       // public final static String ACTION_ID_OPEN = "open";
-       public final static String ACTION_ID_DELETE_BOOKMARK = "deleteBookmark";
-       public final static String ACTION_ID_RENAME_BOOKMARK = "renameBookmark";
-
-       public String getLabel(String actionId) {
-               switch (actionId) {
-               case ACTION_ID_CREATE_FOLDER:
-                       return "Create Folder";
-               case ACTION_ID_BOOKMARK_FOLDER:
-                       return "Bookmark Folder";
-               case ACTION_ID_SHARE_FOLDER:
-                       return "Share Folder";
-               case ACTION_ID_DOWNLOAD_FOLDER:
-                       return "Download as zip archive";
-               case ACTION_ID_RENAME:
-                       return "Rename";
-               case ACTION_ID_DELETE:
-                       return "Delete";
-               case ACTION_ID_UPLOAD_FILE:
-                       return "Upload Files";
-//             case ACTION_ID_OPEN:
-//                     return "Open";
-               case ACTION_ID_DELETE_BOOKMARK:
-                       return "Delete bookmark";
-               case ACTION_ID_RENAME_BOOKMARK:
-                       return "Rename bookmark";
-               default:
-                       throw new IllegalArgumentException("Unknown action ID " + actionId);
-               }
-       }
-
-       public void openFile(Path toOpenPath) {
-               try {
-                       String name = toOpenPath.getFileName().toString();
-                       File tmpFile = File.createTempFile("tmp", name);
-                       tmpFile.deleteOnExit();
-                       try (OutputStream os = new FileOutputStream(tmpFile)) {
-                               Files.copy(toOpenPath, os);
-                       } catch (IOException e) {
-                               throw new IllegalStateException("Cannot open copy " + name + " to tmpFile.", e);
-                       }
-                       String uri = Paths.get(tmpFile.getAbsolutePath()).toUri().toString();
-                       Map<String, String> params = new HashMap<String, String>();
-                       params.put(OpenFile.PARAM_FILE_NAME, name);
-                       params.put(OpenFile.PARAM_FILE_URI, uri);
-                       // FIXME open file without a command
-                       // CommandUtils.callCommand(OpenFile.ID, params);
-               } catch (IOException e1) {
-                       throw new IllegalStateException("Cannot create tmp copy of " + toOpenPath, e1);
-               }
-       }
-
-       public boolean deleteItems(Shell shell, IStructuredSelection selection) {
-               if (selection.isEmpty())
-                       return false;
-
-               StringBuilder builder = new StringBuilder();
-               @SuppressWarnings("unchecked")
-               Iterator<Object> iterator = selection.iterator();
-               List<Path> paths = new ArrayList<>();
-
-               while (iterator.hasNext()) {
-                       Path path = (Path) iterator.next();
-                       builder.append(path.getFileName() + ", ");
-                       paths.add(path);
-               }
-               String msg = "You are about to delete following elements: " + builder.substring(0, builder.length() - 2)
-                               + ". Are you sure?";
-               if (openConfirm(msg)) {
-                       for (Path path : paths) {
-                               try {
-                                       // recursively delete directory and its content
-                                       Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
-                                               @Override
-                                               public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
-                                                       Files.delete(file);
-                                                       return FileVisitResult.CONTINUE;
-                                               }
-
-                                               @Override
-                                               public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
-                                                       Files.delete(dir);
-                                                       return FileVisitResult.CONTINUE;
-                                               }
-                                       });
-                               } catch (DirectoryNotEmptyException e) {
-                                       String errMsg = path.getFileName() + " cannot be deleted: directory is not empty.";
-                                       openError( errMsg);
-                                       throw new IllegalArgumentException("Cannot delete path " + path, e);
-                               } catch (IOException e) {
-                                       String errMsg = e.toString();
-                                       openError(errMsg);
-                                       throw new IllegalArgumentException("Cannot delete path " + path, e);
-                               }
-                       }
-                       return true;
-               }
-               return false;
-       }
-
-       public boolean renameItem(Shell shell, Path parentFolderPath, Path toRenamePath) {
-               String msg = "Enter a new name:";
-               String name = ask( msg, toRenamePath.getFileName().toString());
-               // TODO enhance check of name validity
-               if (EclipseUiUtils.notEmpty(name)) {
-                       try {
-                               Path child = parentFolderPath.resolve(name);
-                               if (Files.exists(child)) {
-                                       String errMsg = "An object named " + name + " already exists at " + parentFolderPath.toString()
-                                                       + ", please provide another name";
-                                       openError( errMsg);
-                                       throw new IllegalArgumentException(errMsg);
-                               } else {
-                                       Files.move(toRenamePath, child);
-                                       return true;
-                               }
-                       } catch (IOException e) {
-                               throw new IllegalStateException("Cannot rename " + name + " at " + parentFolderPath.toString(), e);
-                       }
-               }
-               return false;
-       }
-
-       public boolean createFolder(Shell shell, Path currFolderPath) {
-               String msg = "Enter a name:";
-               String name = ask( msg);
-               // TODO enhance check of name validity
-               if (EclipseUiUtils.notEmpty(name)) {
-                       name = name.trim();
-                       try {
-                               Path child = currFolderPath.resolve(name);
-                               if (Files.exists(child)) {
-                                       String errMsg = "A folder named " + name + " already exists at " + currFolderPath.toString()
-                                                       + ", cannot create";
-                                       openError(errMsg);
-                                       throw new IllegalArgumentException(errMsg);
-                               } else {
-                                       Files.createDirectories(child);
-                                       return true;
-                               }
-                       } catch (IOException e) {
-                               throw new IllegalStateException("Cannot create folder " + name + " at " + currFolderPath.toString(), e);
-                       }
-               }
-               return false;
-       }
-
-//     public void bookmarkFolder(Path toBookmarkPath, Repository repository, DocumentsService documentsService) {
-//             String msg = "Provide a name:";
-//             String name = SingleQuestion.ask("Create bookmark", msg, toBookmarkPath.getFileName().toString());
-//             if (EclipseUiUtils.notEmpty(name))
-//                     documentsService.createFolderBookmark(toBookmarkPath, name, repository);
-//     }
-
-       public boolean uploadFiles(Shell shell, Path currFolderPath) {
-//             shell = Display.getCurrent().getActiveShell();// ignore argument
-               try {
-                       FileDialog dialog = new FileDialog(shell, SWT.MULTI);
-                       dialog.setText("Choose one or more files to upload");
-
-                       if (EclipseUiUtils.notEmpty(dialog.open())) {
-                               String[] names = dialog.getFileNames();
-                               // Workaround small differences between RAP and RCP
-                               // 1. returned names are absolute path on RAP and
-                               // relative in RCP
-                               // 2. in RCP we must use getFilterPath that does not
-                               // exists on RAP
-                               Method filterMethod = null;
-                               Path parPath = null;
-                               try {
-                                       filterMethod = dialog.getClass().getDeclaredMethod("getFilterPath");
-                                       String filterPath = (String) filterMethod.invoke(dialog);
-                                       parPath = Paths.get(filterPath);
-                               } catch (NoSuchMethodException nsme) { // RAP
-                               }
-                               if (names.length == 0)
-                                       return false;
-                               else {
-                                       loop: for (String name : names) {
-                                               Path tmpPath = Paths.get(name);
-                                               if (parPath != null)
-                                                       tmpPath = parPath.resolve(tmpPath);
-                                               if (Files.exists(tmpPath)) {
-                                                       URI uri = tmpPath.toUri();
-                                                       String uriStr = uri.toString();
-
-                                                       if (Files.isDirectory(tmpPath)) {
-                                                               openError(
-                                                                               "Upload of directories in the system is not yet implemented");
-                                                               continue loop;
-                                                       }
-                                                       Path targetPath = currFolderPath.resolve(tmpPath.getFileName().toString());
-                                                       try (InputStream in = new FileInputStream(tmpPath.toFile())) {
-                                                               Files.copy(in, targetPath);
-                                                               Files.delete(tmpPath);
-                                                       }
-                                                       if (log.isDebugEnabled())
-                                                               log.debug("copied uploaded file " + uriStr + " to " + targetPath.toString());
-                                               } else {
-                                                       String msg = "Cannot copy tmp file from " + tmpPath.toString();
-                                                       if (parPath != null)
-                                                               msg += "\nPlease remember that file upload fails when choosing files from the \"Recently Used\" bookmarks on some OS";
-                                                       openError( msg);
-                                                       continue loop;
-                                               }
-                                       }
-                                       return true;
-                               }
-                       }
-               } catch (Exception e) {
-                       CmsFeedback.show("Cannot import files to " + currFolderPath,e);
-               }
-               return false;
-       }
-
-//     public boolean deleteBookmark(Shell shell, IStructuredSelection selection, Node bookmarkParent) {
-//             if (selection.isEmpty())
-//                     return false;
-//
-//             StringBuilder builder = new StringBuilder();
-//             @SuppressWarnings("unchecked")
-//             Iterator<Object> iterator = selection.iterator();
-//             List<Node> nodes = new ArrayList<>();
-//
-//             while (iterator.hasNext()) {
-//                     Node node = (Node) iterator.next();
-//                     builder.append(Jcr.get(node, Property.JCR_TITLE) + ", ");
-//                     nodes.add(node);
-//             }
-//             String msg = "You are about to delete following bookmark: " + builder.substring(0, builder.length() - 2)
-//                             + ". Are you sure?";
-//             if (MessageDialog.openConfirm(shell, "Confirm deletion", msg)) {
-//                     Session session = Jcr.session(bookmarkParent);
-//                     try {
-//                             if (session.hasPendingChanges())
-//                                     throw new DocumentsException("Cannot remove bookmarks, session is not clean");
-//                             for (Node path : nodes)
-//                                     path.remove();
-//                             bookmarkParent.getSession().save();
-//                             return true;
-//                     } catch (RepositoryException e) {
-//                             JcrUtils.discardQuietly(session);
-//                             throw new DocumentsException("Cannot delete bookmarks " + builder.toString(), e);
-//                     }
-//             }
-//             return false;
-//     }
-
-//     public boolean renameBookmark(IStructuredSelection selection) {
-//             if (selection.isEmpty() || selection.size() > 1)
-//                     return false;
-//             Node toRename = (Node) selection.getFirstElement();
-//             String msg = "Please provide a new name.";
-//             String name = SingleQuestion.ask("Rename bookmark", msg, ConnectJcrUtils.get(toRename, Property.JCR_TITLE));
-//             if (EclipseUiUtils.notEmpty(name)
-//                             && ConnectJcrUtils.setJcrProperty(toRename, Property.JCR_TITLE, PropertyType.STRING, name)) {
-//                     ConnectJcrUtils.saveIfNecessary(toRename);
-//                     return true;
-//             }
-//             return false;
-//     }
-}
diff --git a/library/pom.xml b/library/pom.xml
deleted file mode 100644 (file)
index ea051de..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>library</artifactId>
-       <name>Argeo Library Components</name>
-       <packaging>pom</packaging>
-       <modules>
-               <module>org.argeo.library.ui</module>
-       </modules>
-</project>
diff --git a/org.argeo.api.app/.classpath b/org.argeo.api.app/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.api.app/.gitignore b/org.argeo.api.app/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.argeo.api.app/.project b/org.argeo.api.app/.project
new file mode 100644 (file)
index 0000000..9081a67
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.api.app</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.api.app/META-INF/.gitignore b/org.argeo.api.app/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/org.argeo.api.app/bnd.bnd b/org.argeo.api.app/bnd.bnd
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.api.app/build.properties b/org.argeo.api.app/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.argeo.api.app/src/org/argeo/api/app/AppUserState.java b/org.argeo.api.app/src/org/argeo/api/app/AppUserState.java
new file mode 100644 (file)
index 0000000..9250e99
--- /dev/null
@@ -0,0 +1,9 @@
+package org.argeo.api.app;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.CmsSession;
+
+/** Access to content which is specific to a user and their state. */
+public interface AppUserState {
+       Content getOrCreateSessionDir(CmsSession session);
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/EntityConstants.java b/org.argeo.api.app/src/org/argeo/api/app/EntityConstants.java
new file mode 100644 (file)
index 0000000..a609ad8
--- /dev/null
@@ -0,0 +1,8 @@
+package org.argeo.api.app;
+
+/** Constant related to entities, typically used in an OSGi context. */
+public interface EntityConstants {
+       final static String TYPE = "entity.type";
+//     final static String DEFAULT_EDITOR_ID = "entity.defaultEditorId";
+
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/EntityDefinition.java b/org.argeo.api.app/src/org/argeo/api/app/EntityDefinition.java
new file mode 100644 (file)
index 0000000..8ac73fa
--- /dev/null
@@ -0,0 +1,8 @@
+package org.argeo.api.app;
+
+/** The definition of an entity, a composite configurable data structure. */
+public interface EntityDefinition {
+//     String getEditorId(Node entity);
+
+       String getType();
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/EntityMimeType.java b/org.argeo.api.app/src/org/argeo/api/app/EntityMimeType.java
new file mode 100644 (file)
index 0000000..1a0f64c
--- /dev/null
@@ -0,0 +1,60 @@
+package org.argeo.api.app;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/** Supported mime types. */
+public enum EntityMimeType {
+       XML("text/xml", "xml"), CSV("text/csv", "csv");
+
+       private final String mimeType;
+       private final String[] extensions;
+
+       EntityMimeType(String mimeType, String... extensions) {
+               this.mimeType = mimeType;
+               this.extensions = extensions;
+       }
+
+       public String getMimeType() {
+               return mimeType;
+       }
+
+       public String[] getExtensions() {
+               return extensions;
+       }
+
+       public String getDefaultExtension() {
+               if (extensions.length > 0)
+                       return extensions[0];
+               else
+                       return null;
+       }
+
+       public String toHttpContentType(Charset charset) {
+               if (charset == null)
+                       return mimeType;
+               return mimeType + "; charset=" + charset.name();
+       }
+
+       public String toHttpContentType() {
+               if (mimeType.startsWith("text/")) {
+                       return toHttpContentType(StandardCharsets.UTF_8);
+               } else {
+                       return mimeType;
+               }
+       }
+
+       public static EntityMimeType find(String mimeType) {
+               for (EntityMimeType entityMimeType : values()) {
+                       if (entityMimeType.mimeType.equals(mimeType))
+                               return entityMimeType;
+               }
+               return null;
+       }
+
+       @Override
+       public String toString() {
+               return mimeType;
+       }
+
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/EntityName.java b/org.argeo.api.app/src/org/argeo/api/app/EntityName.java
new file mode 100644 (file)
index 0000000..9abfc96
--- /dev/null
@@ -0,0 +1,31 @@
+package org.argeo.api.app;
+
+import org.argeo.api.acr.QNamed;
+
+/** Names used in the entity namespace http://www.argeo.org/ns/entity. */
+public enum EntityName implements QNamed {
+       type, relatedTo, //
+       // time,
+       date,
+       // geography
+       minLat, minLon, maxLat, maxLon,
+       // geo entities
+       place,
+       //
+       ;
+
+       @Override
+       public String getDefaultPrefix() {
+               return "entity";
+       }
+
+       public String basePath() {
+               return '/' + name();
+       }
+
+       @Override
+       public String getNamespace() {
+               return "http://www.argeo.org/ns/entity";
+       }
+
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/EntityNames.java b/org.argeo.api.app/src/org/argeo/api/app/EntityNames.java
new file mode 100644 (file)
index 0000000..5cb69d5
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.api.app;
+
+import org.argeo.api.acr.ldap.LdapAttr;
+
+/** Constants used to name entity structures. */
+public interface EntityNames {
+       @Deprecated
+       final String FORM_BASE = "form";
+       final String SUBMISSIONS_BASE = "submissions";
+       @Deprecated
+       final String TERM = "term";
+       final String NAME = "name";
+
+//     final String ENTITY_DEFINITIONS_PATH = "/entity";
+       @Deprecated
+       final String TYPOLOGIES_PATH = "/" + TERM;
+       /** Administrative units. */
+       final String ADM = "adm";
+
+       @Deprecated
+       final String ENTITY_TYPE = EntityName.type.get();
+
+       // GENERIC CONCEPTS
+//     /** The language which is relevant. */
+//     final String XML_LANG = "xml:lang";
+       /** The date which is relevant. */
+       @Deprecated
+       final String ENTITY_DATE = EntityName.date.get();
+       @Deprecated
+       final String ENTITY_RELATED_TO = EntityName.relatedTo.get();
+
+       // DEFAULT FOLDER NAMES
+       final String MEDIA = "media";
+       final String FILES = "files";
+
+       // LDAP-LIKE ENTITIES
+       @Deprecated
+       final String DISPLAY_NAME = LdapAttr.displayName.get();
+       // Persons
+       @Deprecated
+       final String GIVEN_NAME = LdapAttr.givenName.get();
+       @Deprecated
+       final String SURNAME = LdapAttr.sn.get();
+       @Deprecated
+       final String EMAIL = LdapAttr.mail.get();
+       @Deprecated
+       final String OU = LdapAttr.ou.get();
+
+       // WGS84
+       @Deprecated
+       final String GEO_LAT = WGS84PosName.lat.get();
+       @Deprecated
+       final String GEO_LONG = WGS84PosName.lon.get();
+       @Deprecated
+       final String GEO_ALT = WGS84PosName.alt.get();
+
+       // SVG
+       @Deprecated
+       final String SVG_WIDTH = "svg:width";
+       @Deprecated
+       final String SVG_HEIGHT = "svg:height";
+       @Deprecated
+       final String SVG_LENGTH = "svg:length";
+       @Deprecated
+       final String SVG_UNIT = "svg:unit";
+       @Deprecated
+       final String SVG_DUR = "svg:dur";
+       @Deprecated
+       final String SVG_DIRECTION = "svg:direction";
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/EntityType.java b/org.argeo.api.app/src/org/argeo/api/app/EntityType.java
new file mode 100644 (file)
index 0000000..929045a
--- /dev/null
@@ -0,0 +1,38 @@
+package org.argeo.api.app;
+
+import org.argeo.api.acr.QNamed;
+
+/** Types used in the entity namespace http://www.argeo.org/ns/entity. */
+public enum EntityType implements QNamed {
+       // entity
+       entity, local, relatedTo,
+       // structure
+       space, document,
+       // typology
+       typologies, terms, term,
+       // form
+       form, formSet, formSubmission,
+       // graphics
+       box,
+       // geography
+       geopoint, bearing, geobounded,
+       // ldap
+       person, user;
+
+       public final static String ENTITY_NAMESPACE_URI = "http://www.argeo.org/ns/entity";
+       public final static String ENTITY_DEFAULT_PREFIX = "entity";
+
+       @Override
+       public String getDefaultPrefix() {
+               return ENTITY_DEFAULT_PREFIX;
+       }
+
+       public String basePath() {
+               return '/' + name();
+       }
+
+       @Override
+       public String getNamespace() {
+               return ENTITY_NAMESPACE_URI;
+       }
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/IdRange.java b/org.argeo.api.app/src/org/argeo/api/app/IdRange.java
new file mode 100644 (file)
index 0000000..c70e96a
--- /dev/null
@@ -0,0 +1,133 @@
+package org.argeo.api.app;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ThreadLocalRandom;
+
+/** A range of numerical IDs (typically numerical uid or gid). */
+public class IdRange {
+       // see https://systemd.io/UIDS-GIDS/#special-distribution-uid-ranges
+       final static long MIN_INCLUDED = Long.parseUnsignedLong("66000");
+       final static long MAX_EXCLUDED = Long.parseUnsignedLong("4294967294");
+
+       // We use long as a de facto unsigned int
+       
+       /** included */
+       private final long min;
+       /** included */
+       private final long max;
+
+       public IdRange(long min, long max) {
+               this.min = min;
+               this.max = max;
+       }
+
+       public IdRange(long minPow10) {
+               this(minPow10, maxFromMinPow10(minPow10));
+       }
+
+       public long getMin() {
+               return min;
+       }
+
+       public long getMax() {
+               return max;
+       }
+
+       @Override
+       public int hashCode() {
+               return (int) min;
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (obj instanceof IdRange idRange) {
+                       return min == idRange.min && max == idRange.max;
+               } else
+                       return false;
+       }
+
+       @Override
+       public String toString() {
+               return "[" + Long.toUnsignedString(min) + "," + Long.toUnsignedString(max) + "]";
+       }
+
+       /*
+        * RANGE GENERATION
+        */
+       public static synchronized Set<IdRange> randomRanges10000(int count, Set<IdRange> forbiddenRanges) {
+               Set<IdRange> res = new HashSet<>();
+
+               for (int i = 0; i < count; i++) {
+                       IdRange newRange = null;
+                       do {
+                               newRange = randomRange10000();
+                       } while (overlap(newRange, res) || overlap(newRange, forbiddenRanges));
+                       res.add(newRange);
+               }
+               return res;
+       }
+
+       public static synchronized IdRange randomRange10000() {
+               // TODO make it more generic
+               long minPred = 7l;
+               long maxPred = 429496l;
+
+               long rand = ThreadLocalRandom.current().nextLong(minPred, maxPred);
+               long min = rand * 10000l;
+               return new IdRange(min);
+       }
+
+       public static boolean overlap(IdRange idRange, Set<IdRange> idRanges) {
+               for (IdRange other : idRanges) {
+                       if (overlap(idRange, other))
+                               return true;
+               }
+               return false;
+       }
+
+       public static boolean overlap(IdRange idRange, IdRange other) {
+               // see
+               // https://stackoverflow.com/questions/3269434/whats-the-most-efficient-way-to-test-if-two-ranges-overlap
+               return idRange.min <= other.max && other.min <= idRange.max;
+       }
+
+       /*
+        * UTILITIES
+        */
+
+       private static long maxFromMinPow10(long minPow10) {
+               if ((minPow10 % 100) != 0) {
+                       throw new IllegalArgumentException(minPow10 + " must at least ends with two zeroes");
+               }
+               int exp = 2;
+               exp: for (int i = exp + 1; i < 10; i++) {
+                       if ((minPow10 % pow10(i)) != 0)
+                               break exp;
+                       exp++;
+               }
+//             System.out.println(exp);
+
+               long max = minPow10 + pow10(exp) - 1;
+               return max;
+       }
+
+       /** Power of 10. */
+       private static long pow10(int exp) {
+               if (exp == 0)
+                       return 1;
+               else
+                       return 10 * pow10(exp - 1);
+       }
+
+       public static void main(String... args) {
+               System.out.println(maxFromMinPow10(100));
+               System.out.println(maxFromMinPow10(78500));
+               System.out.println(maxFromMinPow10(716850000));
+
+//             System.out.println(pow10(6));
+//             System.out.println(maxFromMinPow10(12));
+//             System.out.println(maxFromMinPow10(124));
+//             System.out.println(maxFromMinPow10(99814565));
+       }
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/RankedObject.java b/org.argeo.api.app/src/org/argeo/api/app/RankedObject.java
new file mode 100644 (file)
index 0000000..e9c47ce
--- /dev/null
@@ -0,0 +1,113 @@
+package org.argeo.api.app;
+
+import java.util.Map;
+
+import org.argeo.api.cms.CmsLog;
+
+/**
+ * A container for an object whose relevance can be ranked. Typically used in an
+ * OSGi context with the service.ranking property.
+ */
+public class RankedObject<T> {
+       private final static CmsLog log = CmsLog.getLog(RankedObject.class);
+
+       private final static String SERVICE_RANKING = "service.ranking";
+//     private final static String SERVICE_ID = "service.id";
+
+       private T object;
+       private Map<String, Object> properties;
+       private final int rank;
+
+       public RankedObject(T object, Map<String, Object> properties) {
+               this(object, properties, extractRanking(properties));
+       }
+
+       public RankedObject(T object, Map<String, Object> properties, int rank) {
+               super();
+               this.object = object;
+               this.properties = properties;
+               this.rank = rank;
+       }
+
+       private static int extractRanking(Map<String, Object> properties) {
+               if (properties == null)
+                       return 0;
+               if (properties.containsKey(SERVICE_RANKING))
+                       return (Integer) properties.get(SERVICE_RANKING);
+//             else if (properties.containsKey(SERVICE_ID))
+//                     return (Long) properties.get(SERVICE_ID);
+               else
+                       return 0;
+       }
+
+       public T get() {
+               return object;
+       }
+
+       public Map<String, Object> getProperties() {
+               return properties;
+       }
+
+       public int getRank() {
+               return rank;
+       }
+
+       @Override
+       public int hashCode() {
+               return object.hashCode();
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (!(obj instanceof RankedObject))
+                       return false;
+               RankedObject<?> other = (RankedObject<?>) obj;
+               return rank == other.rank && object.equals(other.object);
+       }
+
+       @Override
+       public String toString() {
+               return object.getClass().getName() + " with rank " + rank;
+       }
+
+       public static <K, T> boolean hasHigherRank(Map<K, RankedObject<T>> map, K key, Map<String, Object> properties) {
+               if (!map.containsKey(key))
+                       return true;
+               RankedObject<T> rankedObject = new RankedObject<>(null, properties);
+               RankedObject<T> current = map.get(key);
+               return current.getRank() < rankedObject.getRank();
+       }
+
+       /**
+        * @return the {@link RankedObject}, or <code>null</code> if the current one was
+        *         kept
+        */
+       public static <K, T> RankedObject<T> putIfHigherRank(Map<K, RankedObject<T>> map, K key, T object,
+                       Map<String, Object> properties) {
+               RankedObject<T> rankedObject = new RankedObject<>(object, properties);
+               if (!map.containsKey(key)) {
+                       map.put(key, rankedObject);
+                       if (log.isTraceEnabled())
+                               log.trace(
+                                               "Added " + key + " as " + object.getClass().getName() + " with rank " + rankedObject.getRank());
+                       return rankedObject;
+               } else {
+                       RankedObject<T> current = map.get(key);
+                       if (current.getRank() < rankedObject.getRank()) {
+                               map.put(key, rankedObject);
+                               if (log.isDebugEnabled())
+                                       log.debug("Replaced " + key + " by " + object.getClass().getName() + " with rank "
+                                                       + rankedObject.getRank());
+                               return rankedObject;
+                       } else if (current.getRank() == rankedObject.getRank()) {
+                               log.error("Already " + key + " by " + current.get().getClass().getName() + " with rank "
+                                               + rankedObject.getRank() + ", ignoring " + rankedObject.get().getClass().getName());
+                               return null;
+                       } else {
+                               return null;
+                       }
+               }
+
+       }
+
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/SuiteRole.java b/org.argeo.api.app/src/org/argeo/api/app/SuiteRole.java
new file mode 100644 (file)
index 0000000..07f2499
--- /dev/null
@@ -0,0 +1,47 @@
+package org.argeo.api.app;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.ArgeoNamespace;
+import org.argeo.api.acr.ContentName;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.auth.SystemRole;
+
+/** Standard suite system roles. */
+public enum SuiteRole implements SystemRole {
+       /** An external person who has read access to part of the information. */
+       observer,
+       /** An active coworker. */
+       coworker,
+       /** Someone who is allowed validate and publish information. */
+       publisher,
+       /** Someone with manager status within an organisation. Does not necessarily give more rights. */
+       manager,
+       //
+       ;
+
+       private final static String QUALIFIER = "app.";
+
+       private final ContentName name;
+
+       SuiteRole() {
+               name = new ContentName(ArgeoNamespace.ROLE_NAMESPACE_URI, QUALIFIER + name());
+       }
+
+       @Override
+       public QName qName() {
+               return name;
+       }
+
+       @Deprecated
+       private String getRolePrefix() {
+               return "org.argeo.suite";
+       }
+
+       @Deprecated
+       public String dn() {
+               return new StringBuilder(LdapAttr.cn.name()).append("=").append(getRolePrefix()).append(".").append(name())
+                               .append(",").append(CmsConstants.SYSTEM_ROLES_BASEDN).toString();
+       }
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/Term.java b/org.argeo.api.app/src/org/argeo/api/app/Term.java
new file mode 100644 (file)
index 0000000..18ee8e2
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.api.app;
+
+import java.util.List;
+
+/**
+ * A name within a {@link Typology}, used to qualify an entity (categories,
+ * keywords, etc.).
+ */
+public interface Term {
+       String getId();
+
+       String getName();
+
+//     String getRelativePath();
+
+       Typology getTypology();
+
+       List<? extends Term> getSubTerms();
+
+       Term getParentTerm();
+
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/TermsManager.java b/org.argeo.api.app/src/org/argeo/api/app/TermsManager.java
new file mode 100644 (file)
index 0000000..dadaf9a
--- /dev/null
@@ -0,0 +1,16 @@
+package org.argeo.api.app;
+
+import java.util.List;
+import java.util.Set;
+
+/** Provides optimised access and utilities around terms typologies. */
+public interface TermsManager {
+       Typology getTypology(String typology);
+
+       Set<Typology> getTypologies();
+
+       Term getTerm(String id);
+
+       List<Term> listAllTerms(String typology);
+
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/Typology.java b/org.argeo.api.app/src/org/argeo/api/app/Typology.java
new file mode 100644 (file)
index 0000000..ea560a9
--- /dev/null
@@ -0,0 +1,15 @@
+package org.argeo.api.app;
+
+import java.util.List;
+
+/** A structured and exhaustive set of {@link Term}s. */
+public interface Typology {
+
+       String getId();
+
+       boolean isFlat();
+
+       List<? extends Term> getSubTerms();
+
+       Term findTermByName(String name);
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/WGS84PosName.java b/org.argeo.api.app/src/org/argeo/api/app/WGS84PosName.java
new file mode 100644 (file)
index 0000000..929e98d
--- /dev/null
@@ -0,0 +1,40 @@
+package org.argeo.api.app;
+
+import org.argeo.api.acr.QNamed;
+
+/**
+ * Geographical coordinate in WGS84 reference datum.
+ * 
+ * @see https://www.w3.org/2003/01/geo/
+ */
+public enum WGS84PosName implements QNamed {
+       lat, lon("long"), alt;
+
+       private final String localName;
+
+       private WGS84PosName() {
+               localName = null;
+       }
+
+       private WGS84PosName(String localName) {
+               this.localName = localName;
+       }
+
+       @Override
+       public String getNamespace() {
+               return "http://www.w3.org/2003/01/geo/wgs84_pos#";
+       }
+
+       @Override
+       public String getDefaultPrefix() {
+               return "geo";
+       }
+
+       @Override
+       public String localName() {
+               if (localName != null)
+                       return localName;
+               return QNamed.super.localName();
+       }
+
+}
diff --git a/org.argeo.api.app/src/org/argeo/api/app/entity.xsd b/org.argeo.api.app/src/org/argeo/api/app/entity.xsd
new file mode 100644 (file)
index 0000000..a2fbfcd
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       elementFormDefault="qualified" attributeFormDefault="unqualified"
+       targetNamespace="http://www.argeo.org/ns/entity"
+       xmlns:entity="http://www.argeo.org/ns/entity">
+
+       <xs:attribute name="date" type="xs:date" />
+
+       <xs:element name="local">
+               <xs:complexType>
+                       <xs:sequence>
+                               <xs:any minOccurs="0" maxOccurs="unbounded"
+                                       namespace="##local" processContents="lax" />
+                       </xs:sequence>
+                       <xs:anyAttribute namespace="##any"
+                               processContents="lax" />
+               </xs:complexType>
+       </xs:element>
+
+       <xs:element name="terms">
+               <xs:complexType>
+                       <xs:sequence minOccurs="0" maxOccurs="unbounded">
+                               <xs:element ref="entity:term"></xs:element>
+                       </xs:sequence>
+               </xs:complexType>
+       </xs:element>
+
+       <xs:element name="term">
+               <xs:complexType>
+                       <xs:sequence minOccurs="0" maxOccurs="unbounded">
+                               <xs:element ref="entity:term"></xs:element>
+                       </xs:sequence>
+                       <xs:anyAttribute namespace="##any"
+                               processContents="lax" />
+               </xs:complexType>
+       </xs:element>
+</xs:schema>
\ No newline at end of file
diff --git a/org.argeo.api.app/src/org/argeo/api/app/entityFeature.xsd b/org.argeo.api.app/src/org/argeo/api/app/entityFeature.xsd
new file mode 100644 (file)
index 0000000..805bd1a
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+       xmlns="http://apaf.on.netiket.eu/ns/apaf"
+       targetNamespace="http://apaf.on.netiket.eu/ns/apaf"
+       xmlns:entity="http://www.argeo.org/ns/entity" xmlns:dav="DAV:"
+       xmlns:gml="http://www.opengis.net/gml">
+<!--   <xs:import -->
+<!--           schemaLocation="entity.xsd" -->
+<!--           namespace="http://www.argeo.org/ns/entity"></xs:import> -->
+       <!-- <xs:import -->
+       <!-- schemaLocation="https://schemas.opengis.net/gml/3.2.1/gml.xsd" -->
+       <!-- namespace="http://www.opengis.net/gml/3.2"></xs:import> -->
+       <xs:import namespace="http://www.opengis.net/gml"
+               schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd" />
+
+       <xs:complexType name="entityFeatureType">
+               <xs:complexContent>
+                       <xs:extension base="gml:AbstractFeatureType">
+                               <xs:sequence>
+                                       <xs:element name="area" type="gml:PolygonPropertyType" />
+                                       <xs:element name="geopoint" type="gml:PointPropertyType" />
+                                       <xs:element name="path" type="xs:string" />
+                               </xs:sequence>
+                       </xs:extension>
+               </xs:complexContent>
+       </xs:complexType>
+
+       <xs:element name="entityFeature" type="entityFeatureType"
+               substitutionGroup="gml:_Feature" />
+
+       <!-- <xs:complexType name="TestFeatureCollectionType"> <xs:complexContent> 
+               <xs:extension base="gml:AbstractFeatureCollectionType" /> </xs:complexContent> 
+               </xs:complexType> <xs:element name="TestFeatureCollection" type="TestFeatureCollectionType" 
+               /> -->
+
+</xs:schema>
\ No newline at end of file
diff --git a/org.argeo.app.core/.classpath b/org.argeo.app.core/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.core/.gitignore b/org.argeo.app.core/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.argeo.app.core/.project b/org.argeo.app.core/.project
new file mode 100644 (file)
index 0000000..b5ada14
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.core</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.core/META-INF/.gitignore b/org.argeo.app.core/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/org.argeo.app.core/OSGI-INF/l10n/bundle.properties b/org.argeo.app.core/OSGI-INF/l10n/bundle.properties
new file mode 100644 (file)
index 0000000..2cb3bb2
--- /dev/null
@@ -0,0 +1,121 @@
+dashboard=dashboard
+#people=contacts
+documents=documents
+locations=locations
+recentItems=recent items
+
+#
+# PEOPLE
+# org.argeo.people.ui.PeopleMsg
+#
+person=person
+user=user
+org=organisation
+group=group
+
+# NewPersonWizard
+firstName=First Name
+lastName=Last Name
+salutation=Salutation
+email=Email
+personWizardWindowTitle=New person
+personWizardPageTitle=Create a contact
+personWizardFeedback=Contact was created
+
+# NewOrgWizard
+legalName=Legal name
+legalForm=Legal form
+vatId=VAT ID
+orgWizardWindowTitle=New organisation
+orgWizardPageTitle=Create an organisation
+orgWizardFeedback=Organisation was created
+
+# Roles
+userAdminRole=Can create users and modify them
+groupAdminRole=Can create groups and organisations and modify them
+publisherRole=Can validate and publish content
+coworkerRole=Is an active user of the organisation
+
+# Group
+chooseAMember=Choose a member
+
+# ContextAddressComposite
+chooseAnOrganisation=Choose an organisation
+street=Street
+streetComplement=Street complement
+zipCode=Zip code
+city=City
+state=State
+country=Country
+geopoint=Geopoint
+
+# FilteredOrderableEntityTable
+filterHelp=Type filter criterion separated by a space
+
+# BankAccountComposite
+accountHolder=Account holder
+bankName=Bank name
+currency=Currency
+accountNumber=Account number
+bankNumber=Bank number
+BIC=BIC
+IBAN=IBAN
+
+# EditJobDialog
+position=Role
+chosenItem=Chose item
+department=Department
+isPrimary=Is primary
+searchAndChooseEntity=Search and choose a corresponding entity
+
+# ContactListCTab (e4)
+notes=Notes
+addAContact=Add a contact
+contactValue=Contact value
+linkedCompany=Linked company
+
+# OrgAdminInfoCTab (e4)
+paymentAccount=Payment account
+
+# OrgEditor (e4)
+orgDetails=Details
+orgActivityLog=Activity log
+team=Team
+orgAdmin=Admin.
+
+# PersonEditor (e4)
+personDetails=Contact details
+personActivityLog=Activity log
+personOrgs=Organisations
+personSecurity=Security
+
+# PersonSecurityCTab (e4)
+resetPassword=Reset password
+
+# Generic
+label=Label
+aCustomLabel=A custom label
+description=Description
+value=Value
+name=Name
+primary=Primary
+add=Add
+save=Save
+pickUp=Pick up
+
+# Tags
+confirmNewTag=Tag #{0} is not yet registered. Are you sure you want to create it?
+cannotCreateTag=Tag #{0} is not yet registered and you don't have enough rights to create it.
+
+# People
+people=people
+
+# Library
+content=content
+
+# Geo
+map=map
+
+# Feedback messages
+allFieldsMustBeSet=All fields must be set
+
diff --git a/org.argeo.app.core/OSGI-INF/l10n/bundle_de.properties b/org.argeo.app.core/OSGI-INF/l10n/bundle_de.properties
new file mode 100644 (file)
index 0000000..0af19c2
--- /dev/null
@@ -0,0 +1,98 @@
+dashboard=dashboard
+people=Kontakte
+documents=Dokumente
+locations=Orte
+recentItems=neulich
+
+appTitle=Argeo Suite
+
+#
+# PEOPLE
+# org.argeo.people.ui.PeopleMsg
+#
+person=Person
+organisation=Organisation
+
+# NewPersonWizard
+firstName=Vorname
+lastName=Nachname
+salutation=Salutation
+email=E-Mail
+personWizardWindowTitle=Neue Person
+personWizardPageTitle=Kontakt erstellen
+
+# NewOrgWizard
+legalName=Name
+legalForm=Geschäftsform
+vatId=Ust ID
+orgWizardWindowTitle=Neue Organisation
+orgWizardPageTitle=Organisation erstellen
+
+
+# ContextAddressComposite
+chooseAnOrganisation=Organisation wählen
+street=Strasse
+streetComplement=Strasse Zusatz
+zipCode=PLZ
+city=Stadt
+state=Bundesland
+country=Land
+geopoint=Geopoint
+
+# FilteredOrderableEntityTable
+filterHelp=Type filter criterion separated by a space
+
+# BankAccountComposite
+accountHolder=Kontoinhaber 
+bankName=Name der Bank
+currency=Währung
+accountNumber=Kontonummer
+bankNumber=BLZ
+BIC=BIC
+IBAN=IBAN
+
+# EditJobDialog
+position=Rolle
+chosenItem=Auswahl
+department=Abteilung
+isPrimary=Ist Primär
+searchAndChooseEntity=Suche und wähle ein zugehöriges Objekt
+
+# ContactListCTab (e4)
+notes=Bemerkungen
+addAContact=Kontakt hinzufügen
+contactValue=Kontakt value
+linkedCompany=zugehörige Firma
+
+# OrgAdminInfoCTab (e4)
+paymentAccount=Geschäftskonto
+
+# OrgEditor (e4)
+orgDetails=Details
+orgActivityLog=Aktivitäten Log
+team=Team
+orgAdmin=Admin.
+
+# PersonEditor (e4)
+personDetails=Kontakt Daten
+personActivityLog=Aktivitäten Log
+personOrgs=Organisationen
+personSecurity=Sicherheit
+
+# PersonSecurityCTab (e4)
+resetPassword=Passwort zurücksetzen
+
+# Generic
+label=Beschriftung
+aCustomLabel=Eine spezifische Beschriftung
+description=Beschreibung
+value=Wert
+name=Name
+primary=Haupt-
+add=Hinzufügen
+save=Speichern
+pickUp=Aussuchen
+
+# Tags
+confirmNewTag=Das Hashtag '{0}' existiert noch nicht. WollenSie es hinzufügen?
+cannotCreateTag=Das Hashtag '{0}' existiert nicht uns Sie haben nicht die Rechte, um es hinzufügen.
diff --git a/org.argeo.app.core/OSGI-INF/l10n/bundle_fr.properties b/org.argeo.app.core/OSGI-INF/l10n/bundle_fr.properties
new file mode 100644 (file)
index 0000000..0015269
--- /dev/null
@@ -0,0 +1,117 @@
+dashboard=dashboard
+people=contacts
+documents=documents
+locations=lieux
+recentItems=récent
+
+appTitle=Argeo Suite
+
+#
+# GENERIC
+#
+
+#
+# PEOPLE
+# org.argeo.people.ui.PeopleMsg
+#
+person=personne
+user=utilisateur
+org=organisation
+group=groupe
+
+# NewPersonWizard
+firstName=Prénom
+lastName=Nom
+salutation=Salutation
+email=Email
+personWizardWindowTitle=Nouvelle personne
+personWizardPageTitle=Créer un contact
+personWizardFeedback=Le contact a Ã©té créé
+
+# NewOrgWizard
+legalName=Nom
+legalForm=Forme légale
+vatId=ID TVA
+orgWizardWindowTitle=Nouvelle organisation
+orgWizardPageTitle=Créer une organisation
+orgWizardFeedback=L'organisation a Ã©té crée
+
+# Roles
+userAdminRole=Peut créer des utilisateurs et les modifier
+groupAdminRole=Peut créer des groupes et des organisations et les modifier
+publisherRole=Peut publier et valider du contenu
+coworkerRole=Est un membre en activité de l'organisation
+
+# Group
+chooseAMember=Choisir un membre
+
+# ContextAddressComposite
+chooseAnOrganisation=Choisir une organisation
+street=Rue
+streetComplement=Complément rue
+zipCode=Code postal
+city=Ville
+state=État
+country=Pays
+geopoint=Géocoordonnées
+
+# FilteredOrderableEntityTable
+filterHelp=Sasir les critères de filtrage séparés par des espaces 
+
+# BankAccountComposite
+accountHolder=Propriétaire du compte
+bankName=Nom de la banque
+currency=Devise
+accountNumber=Numéro de compte
+bankNumber=Numéro de banque
+BIC=BIC
+IBAN=IBAN
+
+# EditJobDialog
+position=Rôle
+chosenItem=Choisir une Ã©lément
+department=Service
+isPrimary=Principal
+searchAndChooseEntity=Cherhcer et choisir l'entitée correspondante
+
+# ContactListCTab (e4)
+notes=Notes
+addAContact=Ajouter un contact
+contactValue=Valeur
+linkedCompany=Entreprise liée
+
+# OrgAdminInfoCTab (e4)
+paymentAccount=Compte de paiement
+
+# OrgEditor (e4)
+orgDetails=Détails
+orgActivityLog=Activités
+team=Équipe
+orgAdmin=Admin.
+
+# PersonEditor (e4)
+personDetails=Détails du contact
+personActivityLog=Activités
+personOrgs=Organisations
+personSecurity=Accès
+
+# PersonSecurityCTab (e4)
+resetPassword=Force le mot de passe
+
+# Generic
+label=Étiquette
+aCustomLabel=Une Ã©tiquette spécifique
+description=Description
+value=Valeur
+name=Nom
+primary=Principal
+add=Ajouter
+save=Sauver
+pickUp=Choisir
+
+# Tags
+confirmNewTag=Le tag #{0} n'existe pas encore. Voulez-vous le créer?
+cannotCreateTag=Le tag #{0} n'existe pas encore et vous n'avez pas les droits pour le créer.
+
+# Feedback messages
+allFieldsMustBeSet=Toutes les données doivent Ãªtre renseignées
diff --git a/org.argeo.app.core/OSGI-INF/suiteMaintenance.xml b/org.argeo.app.core/OSGI-INF/suiteMaintenance.xml
new file mode 100644 (file)
index 0000000..d06afa6
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="org.argeo.app.core.suiteMaintenance">
+   <implementation class="org.argeo.app.core.SuiteMaintenance"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.spi.ProvidedRepository" name="ContentRepository" policy="static"/>
+</scr:component>
diff --git a/org.argeo.app.core/OSGI-INF/termsContentProvider.xml b/org.argeo.app.core/OSGI-INF/termsContentProvider.xml
new file mode 100644 (file)
index 0000000..2a1d10e
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" name="org.argeo.app.termsContentProvider">
+   <implementation class="org.argeo.app.acr.terms.TermsContentProvider"/>
+   <reference bind="setService" cardinality="1..1" interface="org.argeo.api.app.TermsManager" name="TermsManager" policy="static"/>
+   <service>
+      <provide interface="org.argeo.api.acr.spi.ContentProvider"/>
+   </service>
+   <property name="acr.mount.path" type="String" value="/terms"/>
+</scr:component>
diff --git a/org.argeo.app.core/bnd.bnd b/org.argeo.app.core/bnd.bnd
new file mode 100644 (file)
index 0000000..88c59a9
--- /dev/null
@@ -0,0 +1,12 @@
+Bundle-ActivationPolicy: lazy
+
+Service-Component:\
+OSGI-INF/suiteMaintenance.xml,\
+OSGI-INF/termsContentProvider.xml,\
+
+Import-Package:\
+javax.measure.quantity,\
+org.osgi.service.useradmin,\
+tech.units.indriya.unit,\
+org.argeo.cms.acr,\
+*
diff --git a/org.argeo.app.core/build.properties b/org.argeo.app.core/build.properties
new file mode 100644 (file)
index 0000000..741e843
--- /dev/null
@@ -0,0 +1,9 @@
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               OSGI-INF/appUserState.xml,\
+               OSGI-INF/suiteMaintenance.xml,\
+               OSGI-INF/termsContentProvider.xml
+additional.bundles = org.argeo.init
+source.. = src/
+output.. = bin/
diff --git a/org.argeo.app.core/src/org/argeo/app/acr/terms/TermContent.java b/org.argeo.app.core/src/org/argeo/app/acr/terms/TermContent.java
new file mode 100644 (file)
index 0000000..2cc5fb5
--- /dev/null
@@ -0,0 +1,46 @@
+package org.argeo.app.acr.terms;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ContentProvider;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.api.app.Term;
+import org.argeo.cms.acr.AbstractContent;
+
+public class TermContent extends AbstractContent {
+       private TermsContentProvider provider;
+       private Term term;
+
+       public TermContent(ProvidedSession session, TermsContentProvider provider, Term term) {
+               super(session);
+               this.provider = provider;
+               this.term = term;
+       }
+
+       @Override
+       public Iterator<Content> iterator() {
+               return term.getSubTerms().stream().map((t) -> (Content) new TermContent(getSession(), provider, t)).iterator();
+       }
+
+       @Override
+       public ContentProvider getProvider() {
+               return provider;
+       }
+
+       @Override
+       public QName getName() {
+               return NamespaceUtils.unqualified(term.getName());
+       }
+
+       @Override
+       public Content getParent() {
+               Term parentTerm = term.getParentTerm();
+               return parentTerm == null ? new TypologyContent(getSession(), provider, term.getTypology())
+                               : new TermContent(getSession(), provider, parentTerm);
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/acr/terms/TermsContentProvider.java b/org.argeo.app.core/src/org/argeo/app/acr/terms/TermsContentProvider.java
new file mode 100644 (file)
index 0000000..8e58667
--- /dev/null
@@ -0,0 +1,69 @@
+package org.argeo.app.acr.terms;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentNotFoundException;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.api.app.Typology;
+import org.argeo.cms.acr.AbstractSimpleContentProvider;
+import org.argeo.cms.acr.ContentUtils;
+
+public class TermsContentProvider extends AbstractSimpleContentProvider<TermsManager> {
+
+       public TermsContentProvider() {
+               super(EntityType.ENTITY_NAMESPACE_URI, EntityType.ENTITY_DEFAULT_PREFIX);
+       }
+
+       @Override
+       protected Iterator<Content> firstLevel(ProvidedSession session) {
+               return getService().getTypologies().stream().map((t) -> (Content) new TypologyContent(session, this, t))
+                               .iterator();
+       }
+
+       @Override
+       public ProvidedContent get(ProvidedSession session, List<String> segments) {
+               String typologyName = segments.get(0);
+               Typology typology = getService().getTypology(typologyName);
+               if (segments.size() == 1)
+                       return new TypologyContent(session, this, typology);
+               Term currTerm = null;
+               terms: for (Term term : typology.getSubTerms()) {
+                       if (term.getName().equals(segments.get(1))) {
+                               currTerm = term;
+                               break terms;
+                       }
+               }
+               if (currTerm == null)
+                       throw new ContentNotFoundException(session,
+                                       getMountPath() + "/" + ContentUtils.toPath(segments) + " cannot be found");
+               if (segments.size() == 1)
+                       return new TermContent(session, this, currTerm);
+
+               for (int i = 2; i < segments.size(); i++) {
+                       String termName = segments.get(i);
+                       Term nextTerm = null;
+                       terms: for (Term term : currTerm.getSubTerms()) {
+                               if (term.getName().equals(termName)) {
+                                       nextTerm = term;
+                                       break terms;
+                               }
+                       }
+                       if (nextTerm == null)
+                               throw new ContentNotFoundException(session,
+                                               getMountPath() + "/" + ContentUtils.toPath(segments) + " cannot be found");
+                       currTerm = nextTerm;
+               }
+               return new TermContent(session, this, currTerm);
+       }
+
+       ServiceContent getRootContent(ProvidedSession session) {
+               return new ServiceContent(session);
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/acr/terms/TypologyContent.java b/org.argeo.app.core/src/org/argeo/app/acr/terms/TypologyContent.java
new file mode 100644 (file)
index 0000000..d4b0c00
--- /dev/null
@@ -0,0 +1,45 @@
+package org.argeo.app.acr.terms;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ContentProvider;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.api.app.Typology;
+import org.argeo.cms.acr.AbstractContent;
+
+public class TypologyContent extends AbstractContent {
+       private TermsContentProvider provider;
+       private Typology typology;
+
+       public TypologyContent(ProvidedSession session, TermsContentProvider provider, Typology typology) {
+               super(session);
+               this.provider = provider;
+               this.typology = typology;
+       }
+
+       @Override
+       public ContentProvider getProvider() {
+               return provider;
+       }
+
+       @Override
+       public QName getName() {
+               return NamespaceUtils.unqualified(typology.getId());
+       }
+
+       @Override
+       public Content getParent() {
+               return provider.getRootContent(getSession());
+       }
+
+       @Override
+       public Iterator<Content> iterator() {
+               return typology.getSubTerms().stream().map((t) -> (Content) new TermContent(getSession(), provider, t))
+                               .iterator();
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/core/AbstractEntityDefinition.java b/org.argeo.app.core/src/org/argeo/app/core/AbstractEntityDefinition.java
new file mode 100644 (file)
index 0000000..7ccabd1
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.app.core;
+
+import org.argeo.api.app.EntityDefinition;
+
+public abstract class AbstractEntityDefinition implements EntityDefinition {
+
+       public void init() {
+
+       }
+
+       public void destroy() {
+
+       }
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteContentNamespace.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteContentNamespace.java
new file mode 100644 (file)
index 0000000..4645649
--- /dev/null
@@ -0,0 +1,118 @@
+package org.argeo.app.core;
+
+import static java.lang.System.Logger.Level.ERROR;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.Objects;
+
+import org.argeo.api.acr.spi.ContentNamespace;
+import org.argeo.cms.acr.CmsContentNamespace;
+
+public enum SuiteContentNamespace implements ContentNamespace {
+       //
+       // ARGEO
+       //
+       ENTITY("entity", "http://www.argeo.org/ns/entity",
+                       "platform:/plugin/org.argeo.app.api/org/argeo/api/app/entity.xsd", null),
+       //
+       ARGEO_DBK("argeodbk", "http://www.argeo.org/ns/argeodbk", null, null),
+       //
+       // EXTERNAL
+       //
+       DOCBOOK5("dbk", "http://docbook.org/ns/docbook", "docbook.xsd", "http://docbook.org/xml/5.0.1/xsd/docbook.xsd"),
+       //
+       XML_EVENTS("ev", "http://www.w3.org/2001/xml-events", "xml-events-attribs-1.xsd",
+                       "http://www.w3.org/MarkUp/SCHEMA/xml-events-attribs-1.xsd"),
+       //
+       XFORMS("xforms", "http://www.w3.org/2002/xforms", "XForms-11-Schema.xsd",
+                       "https://www.w3.org/MarkUp/Forms/2007/XForms-11-Schema.xsd"),
+       //
+       XCARD("xcard", "urn:ietf:params:xml:ns:vcard-4.0", "xCard-4.0.xsd", null),
+       //
+       XSL_FO("fo", "http://www.w3.org/1999/XSL/Format", "fop.xsd",
+                       "https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk/fop/src/foschema/fop.xsd"),
+       //
+//     XCAL_2_0("xcal", "urn:ietf:params:xml:ns:icalendar-2.0", "xCal-2.0.xsd", null),
+       //
+       XHTML("h", "http://www.w3.org/1999/xhtml", null, "https://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"),
+       //
+       // ODK
+       //
+       JR("jr", "http://openrosa.org/javarosa", null, null),
+       //
+       ORX("orx", "http://openrosa.org/xforms", null, null),
+       //
+       ORX_LIST("orxList", "http://openrosa.org/xforms/xformsList", null, null),
+       //
+       ORX_MANIFEST("orxManifest", "http://openrosa.org/xforms/xformsManifest", null, null),
+       //
+       ODK("odk", "http://www.opendatakit.org/xforms", null, null),
+       //
+       WGS84("geo", "http://www.w3.org/2003/01/geo/wgs84_pos#", null, null),
+       // Re-add XML in order to solve import issue with xlink
+       XML("xml", "http://www.w3.org/XML/1998/namespace", "xml.xsd", "http://www.w3.org/2001/xml.xsd"),
+       //
+
+       ;
+
+       private final static String RESOURCE_BASE = "/org/argeo/app/core/schemas/";
+
+       private String defaultPrefix;
+       private String namespace;
+       private URL resource;
+       private URL publicUrl;
+
+       SuiteContentNamespace(String defaultPrefix, String namespace, String resourceFileName, String publicUrl) {
+               Objects.requireNonNull(namespace);
+               this.defaultPrefix = defaultPrefix;
+               Objects.requireNonNull(namespace);
+               this.namespace = namespace;
+               if (resourceFileName != null) {
+                       try {
+                               // FIXME workaround when in nested OSGi frameworks
+                               // we should use class path, as before
+                               if (!resourceFileName.startsWith("platform:")) {
+                                       resource = URI.create("platform:/plugin/org.argeo.app.core" + RESOURCE_BASE + resourceFileName)
+                                                       .toURL();
+                               } else {
+                                       resource = URI.create(resourceFileName).toURL();
+                               }
+                       } catch (MalformedURLException e) {
+                               resource = null;
+                               System.getLogger(CmsContentNamespace.class.getName()).log(ERROR,
+                                               "Cannot load " + resourceFileName + ": " + e.getMessage());
+                               // throw new IllegalArgumentException("Cannot convert " + resourceFileName + "
+                               // to URL");
+                       }
+                       // Objects.requireNonNull(resource);
+               }
+               if (publicUrl != null)
+                       try {
+                               this.publicUrl = new URL(publicUrl);
+                       } catch (MalformedURLException e) {
+                               throw new IllegalArgumentException("Cannot interpret public URL", e);
+                       }
+       }
+
+       @Override
+       public String getDefaultPrefix() {
+               return defaultPrefix;
+       }
+
+       @Override
+       public String getNamespaceURI() {
+               return namespace;
+       }
+
+       @Override
+       public URL getSchemaResource() {
+               return resource;
+       }
+
+       public URL getPublicUrl() {
+               return publicUrl;
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenance.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteMaintenance.java
new file mode 100644 (file)
index 0000000..e1fb4fe
--- /dev/null
@@ -0,0 +1,66 @@
+package org.argeo.app.core;
+
+import javax.measure.Quantity;
+import javax.measure.quantity.Area;
+
+import org.argeo.api.acr.spi.ProvidedRepository;
+//import org.geotools.gml3.v3_2.GML;
+
+import si.uom.SI;
+import tech.units.indriya.quantity.Quantities;
+
+/**
+ * Background service starting and stopping with the whole system, and making
+ * sure it is in a proper state.
+ */
+public class SuiteMaintenance {
+       private ProvidedRepository contentRepository;
+
+       public void start() {
+               // make sure that the unit system is initialised
+               Quantity<Area> dummy = Quantities.getQuantity(0, SI.SQUARE_METRE);
+
+               getContentRepository().registerTypes(SuiteContentNamespace.values());
+//             for (SuiteContentTypes types : SuiteContentTypes.values()) {
+//                     getContentRepository().registerTypes(types.getDefaultPrefix(), types.getNamespace(),
+//                                     types.getResource() != null ? types.getResource().toExternalForm() : null);
+//             }
+
+               // GML schema import fails because of xlinks issues
+//             getContentRepository().registerTypes(new ContentNamespace() {
+//
+//                     @Override
+//                     public URL getSchemaResource() {
+//                             try {
+//                                     return new URL(GML.getInstance().getSchemaLocation());
+//                             } catch (MalformedURLException e) {
+//                                     throw new IllegalArgumentException(e);
+//                             }
+//                     }
+//
+//                     @Override
+//                     public String getNamespaceURI() {
+//                             return GML.getInstance().getNamespaceURI();
+//                     }
+//
+//                     @Override
+//                     public String getDefaultPrefix() {
+//                             return "gml";
+//                     }
+//             });
+
+       }
+
+       public void stop() {
+
+       }
+
+       protected ProvidedRepository getContentRepository() {
+               return contentRepository;
+       }
+
+       public void setContentRepository(ProvidedRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java b/org.argeo.app.core/src/org/argeo/app/core/SuiteUtils.java
new file mode 100644 (file)
index 0000000..adaf510
--- /dev/null
@@ -0,0 +1,74 @@
+package org.argeo.app.core;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.auth.RoleNameUtils;
+
+/** Utilities around the Argeo Suite APIs. */
+public class SuiteUtils {
+       public final static String USER_STATE_NODE_NAME = "state";
+       public final static String USER_DEVICES_NODE_NAME = "devices";
+       public final static String USER_SESSIONS_NODE_NAME = "sessions";
+
+       public static String getUserNodePath(String userDn) {
+               String uid = RoleNameUtils.getLastRdnValue(userDn);
+               return EntityType.user.basePath() + '/' + uid;
+       }
+
+       public static Set<String> extractRoles(String[] semiColArr) {
+               Set<String> res = new HashSet<>();
+               // TODO factorize and make it more robust
+               final String rolesPrefix = "roles:=\"";
+               // first one is layer id
+               for (int i = 1; i < semiColArr.length; i++) {
+                       if (semiColArr[i].startsWith(rolesPrefix)) {
+                               String rolesStr = semiColArr[i].substring(rolesPrefix.length());
+                               // remove last "
+                               rolesStr = rolesStr.substring(0, rolesStr.lastIndexOf('\"'));
+                               // TODO support AND (&) as well
+                               String[] roles = rolesStr.split("\\|");// OR (|)
+                               for (String role : roles) {
+                                       res.add(role.trim());
+                               }
+                       }
+               }
+               return res;
+       }
+
+       synchronized static public long findNextId(Content hierarchyUnit, QName cclass) {
+               if (!hierarchyUnit.hasContentClass(LdapObj.posixGroup.qName()))
+                       throw new IllegalArgumentException(hierarchyUnit + " is not a POSIX group");
+
+               long min = hierarchyUnit.get(LdapAttr.gidNumber.qName(), Long.class).orElseThrow();
+               long currentMax = 0l;
+               for (Content childHu : hierarchyUnit) {
+                       if (!childHu.hasContentClass(LdapObj.organizationalUnit.qName()))
+                               continue;
+                       // FIXME filter out functional hierarchy unit
+                       for (Content role : childHu) {
+                               if (role.hasContentClass(cclass)) {
+
+                                       if (LdapObj.posixAccount.qName().equals(cclass)) {
+                                               Long id = role.get(LdapAttr.uidNumber.qName(), Long.class).orElseThrow();
+                                               if (id > currentMax)
+                                                       currentMax = id;
+                                       }
+                               }
+                       }
+               }
+               if (currentMax == 0l)
+                       return min;
+               return currentMax + 1;
+       }
+
+       /** Singleton. */
+       private SuiteUtils() {
+       }
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/XForms-11-Schema.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/XForms-11-Schema.xsd
new file mode 100644 (file)
index 0000000..881bfcb
--- /dev/null
@@ -0,0 +1,1571 @@
+<?xml version="1.0"?>
+<xsd:schema targetNamespace="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" elementFormDefault="qualified">
+       <!--
+  Changes:
+26-Aug MJD fixed typo where more than one child allowed on <instance>
+04-Sep MJD fixed typo on <send> : attribute 'submission' is required
+04-Sep MJD fixed typo on <rebuild><recalculate><revalidate><refresh>: '' attribute is required
+06-Sep MJD clarified specific allowed values of @level on <message>
+06-Sep MJD removed UI Common attributes from <help><hint><alert><label>
+09-Sep MJD changed minOccurrs and maxOccurs to use XPath expressions, default values
+09-Sep MJD fixed typo: added linking attributes to <message>
+09-Sep MJD removed <extension> from content models of <mode> and UI common elements
+09-Sep MJD fixed typo: removed 'format' attribute
+17-Sep MJD fixed typo: <output> now uses the attribute group for binding attributes, instead of similarly named individual attrs
+17-Sep MJD added XPathExpression simpleType for internal use. This doesn't actually change anything, but makes
+the Schema a better documentation resource (instead of using xsd:string for everything)
+17-Sep MJD removed 'mediatype' attribute from <submission>, as it was unused
+17-Sep MJD fixed typo: only 'ref' and 'bind' attributes, not 'model' on <submission>
+17-Sep MJD added XML Events attributes to <model>
+17-Sep MJD in accordance with 3.2.1, removed all id attributes
+19-Sep MJD fixed typo: clarified that nested <action>s are permitted.
+19-Sep MJD factor UI.Inline into <group>. Renamed <group>s and <attributeGroup>s to match the prose names
+19-Sep MJD changed to agreed-upon namespace for CR
+25-Sep MJD fixed typo: added UI.Inlne to content model of <message>, enabled mixed content
+29-Sep MJD fixed typo: 'model' required on <reset>
+29-Sep MJD fixed typo: binding attributes allowed on <submit>
+29-Sep MJD fixed typo: explicit enumerated values for 'show' on <load>
+04-Oct MJD 'resource' attribute not required
+
+12-Nov 2002 : Published as CR
+
+13-Jan MJD added new attribute includenamespaceprefixes on <submission>
+13-Jan MJD added UI Common elements to content model of <group>
+03-Feb MJD synchoninzed duration types with 15 Nov Query Operators document
+31-Mar MJD added mediatype attribute on <submission>
+14-May MJD typo : "xsd:NCName"
+26-Jun MJD removed 'accesskey' and 'navindex' (over to host language definition)
+
+01-Aug 2003 : Published as PR
+
+15-Sep MJD final namespace
+15-Sep MJD corrected content model of <value>
+15-Sep MJD changed the name of the import for XML Events to highlight that only the attributes are used
+
+1.0 Second Edition errata
+
+16-Apr 2005 RAM - erratum E4 - optional @model
+16-Apr 2005 RAM - erratum E22 - default value for @show
+16-Apr 2005 RAM - erratum E54 - remove xforms:minOccurs and xforms:maxOccurs
+26-Jun 2005 RAM - erratum E71 - allow an empty case element
+
+16-Jun 2006 JMB - erratum E69 - instance attribute in submission; id in common attributes
+
+15-Aug-2006 CFW - erratum E18 on 2nd ed. Added Action to content model for Case
+
+09-Sep 2006 JMB - non-substantive: explicitly declared some use="optional" settings, 
+                  substantive: erratum E18 on 2nd ed. Declared default false for selected attribute of case
+                  substantive: erratum E21 on 2nd ed. Added multipart-post to enumeration of method attribute
+23-Nov 2006 JMB - substantive: erratum E32 on 2nd ed. switch in repeat
+17-Jul 2007 JMB - substantive: erratum E41 on 2nd ed. version attribute and associated simple types
+
+XForms 1.1
+
+25 Oct 2007 CFW, NvdB and JMB - Updated to XForms 1.1
+21 Nov 2007 JMB: Fixed description of card-number datatype
+08 Apr 2008 JMB: Fixed NCName (was NCNAME)
+30 MAY 2008 JMB: Changed card-number to allow zero or more digits
+22 JUN 2008 JMB: Renamed UI.Inline to UI.Content
+07 SEP 2008 LLK: Added element header attribute combine. header now allows one name, multiple value.
+09 MAR 2009 JMB: Changed @separator default to ampersand
+19 MAY 2009 JMB: Added submission/@targetref, dispatch/@targetid and dispatch/targetid
+10 JUN 2009 JMB: Moved switch/case from global space to being local to switch for clarity
+13 JAN 2010 JMB: Put maxOccurs=1 on instance content to limit to one child element in an instance
+16 SEP 2010 JBM: Added xforms:duration datatype (1.1 Erratum #1), added UICommon before ListUICommon on select/select1 (1.1 Erratum #2)
+-->
+       <xsd:import namespace="http://www.w3.org/2001/xml-events" schemaLocation="xml-events-attribs-1.xsd"/>
+       <xsd:import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="XMLSchema.xsd"/>
+
+       <!--
+structural elements
+-->
+       <xsd:attributeGroup name="Common.Attributes">
+               <xsd:annotation>
+                       <xsd:documentation>Attributes for _every_ element in XForms</xsd:documentation>
+               </xsd:annotation>
+               <xsd:attribute name="id" type="xsd:ID" use="optional"/>
+               <xsd:anyAttribute namespace="##other"/>
+       </xsd:attributeGroup>
+
+       <xsd:attributeGroup name="Single.Node.Binding.Attributes">
+               <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
+               <xsd:attribute name="ref" type="xforms:XPathExpression" use="optional"/>
+               <xsd:attribute name="bind" type="xsd:IDREF" use="optional"/>
+       </xsd:attributeGroup>
+
+       <xsd:attributeGroup name="Nodeset.Binding.Attributes">
+               <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
+               <xsd:attribute name="nodeset" type="xforms:XPathExpression" use="optional"/>
+               <xsd:attribute name="bind" type="xsd:IDREF" use="optional"/>
+       </xsd:attributeGroup>
+
+       <xsd:attributeGroup name="Linking.Attributes">
+               <xsd:attribute name="src" type="xsd:anyURI"/>
+       </xsd:attributeGroup>
+
+       <xsd:element name="model">
+               <xsd:complexType>
+                       <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+                               <xsd:choice>
+                                       <xsd:element ref="xforms:instance"/>
+                                       <xsd:element ref="xsd:schema"/>
+                                       <xsd:element ref="xforms:submission"/>
+                                       <xsd:element ref="xforms:bind"/>
+                                       <xsd:group ref="xforms:Action"/>
+                               </xsd:choice>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attribute name="functions" type="xforms:QNameList" use="optional"/>
+                       <xsd:attribute name="schema" type="xforms:anyURIList" use="optional"/>
+                       <xsd:attribute name="version" type="xforms:versionList" use="optional"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="instance">
+               <xsd:annotation>
+                       <xsd:documentation>instance container.</xsd:documentation>
+               </xsd:annotation>
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="1"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Linking.Attributes"/>
+                       <xsd:attribute name="resource" type="xsd:anyURI" use="optional"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="bind">
+               <xsd:annotation>
+                       <xsd:documentation>Definition of bind container.</xsd:documentation>
+               </xsd:annotation>
+               <xsd:complexType>
+                       <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+                               <xsd:element ref="xforms:bind"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="nodeset" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="calculate" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="type" type="xsd:QName" use="optional"/>
+                       <xsd:attribute name="required" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="constraint" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="relevant" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="readonly" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="p3ptype" type="xsd:string" use="optional"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="extension">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:any namespace="##other"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <!--
+User Interface form controls
+-->
+       <xsd:group name="Core.Form.Controls">
+               <xsd:choice>
+                       <xsd:element ref="xforms:input"/>
+                       <xsd:element ref="xforms:secret"/>
+                       <xsd:element ref="xforms:textarea"/>
+                       <xsd:element ref="xforms:output"/>
+                       <xsd:element ref="xforms:upload"/>
+                       <xsd:element ref="xforms:select1"/>
+                       <xsd:element ref="xforms:select"/>
+                       <xsd:element ref="xforms:range"/>
+                       <xsd:element ref="xforms:submit"/>
+                       <xsd:element ref="xforms:trigger"/>
+               </xsd:choice>
+       </xsd:group>
+
+       <xsd:group name="Container.Form.Controls">
+               <xsd:choice>
+                       <xsd:element ref="xforms:group"/>
+                       <xsd:element ref="xforms:switch"/>
+                       <xsd:element ref="xforms:repeat"/>
+               </xsd:choice>
+       </xsd:group>
+
+       <xsd:attributeGroup name="UI.Common.Attrs">
+               <xsd:attribute name="appearance" type="xforms:appearanceType" use="optional"/>
+       </xsd:attributeGroup>
+
+       <xsd:group name="UI.Content">
+               <xsd:sequence>
+                       <xsd:choice minOccurs="0">
+                               <xsd:element ref="xforms:output"/>
+                               <!-- containing document language to add additional allowed content here -->
+                       </xsd:choice>
+               </xsd:sequence>
+       </xsd:group>
+
+       <xsd:group name="UI.Common">
+               <xsd:sequence>
+                       <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                               <xsd:element ref="xforms:help"/>
+                               <xsd:element ref="xforms:hint"/>
+                               <xsd:element ref="xforms:alert"/>
+                               <xsd:group ref="xforms:Action"/>
+                       </xsd:choice>
+               </xsd:sequence>
+       </xsd:group>
+
+       <xsd:element name="label">
+               <xsd:complexType mixed="true">
+                       <xsd:group ref="xforms:UI.Content"/>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="hint">
+               <xsd:complexType mixed="true">
+                       <xsd:group ref="xforms:UI.Content"/>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="help">
+               <xsd:complexType mixed="true">
+                       <xsd:group ref="xforms:UI.Content"/>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="alert">
+               <xsd:complexType mixed="true">
+                       <xsd:group ref="xforms:UI.Content"/>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:group name="List.UI.Common">
+               <xsd:sequence>
+                       <xsd:choice>
+                               <xsd:element ref="xforms:item"/>
+                               <xsd:element ref="xforms:itemset"/>
+                               <xsd:element ref="xforms:choices"/>
+                       </xsd:choice>
+               </xsd:sequence>
+       </xsd:group>
+       <xsd:element name="item">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:element ref="xforms:value"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="itemset">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:choice>
+                                       <xsd:element ref="xforms:value"/>
+                                       <xsd:element ref="xforms:copy"/>
+                               </xsd:choice>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="choices">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label" minOccurs="0"/>
+                               <xsd:sequence maxOccurs="unbounded">
+                                       <xsd:choice>
+                                               <xsd:element ref="xforms:choices"/>
+                                               <xsd:element ref="xforms:item"/>
+                                               <xsd:element ref="xforms:itemset"/>
+                                       </xsd:choice>
+                               </xsd:sequence>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="value">
+               <xsd:complexType>
+                       <xsd:simpleContent>
+                               <xsd:extension base="xsd:string">
+                                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                                       <xsd:attribute name="value" type="xforms:XPathExpression" use="optional"/>
+                               </xsd:extension>
+                       </xsd:simpleContent>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="copy">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+<!--
+       <xsd:element name="filename">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="mediatype">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+-->
+       <xsd:complexType name="filename">
+               <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+               <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+       </xsd:complexType>
+       <xsd:complexType name="mediatype">
+               <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+               <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+       </xsd:complexType>
+       <xsd:complexType name="mediatypeWithValue">
+               <xsd:complexContent>
+                       <xsd:extension base="xforms:mediatype">
+                               <xsd:attribute name="value" type="xforms:XPathExpression" use="optional"/>
+                       </xsd:extension>
+               </xsd:complexContent>
+       </xsd:complexType>
+
+       <xsd:element name="input">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attribute name="inputmode" type="xsd:string" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="secret">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attribute name="inputmode" type="xsd:string" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="textarea">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attribute name="inputmode" type="xsd:string" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="upload">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <!--
+                               <xsd:element ref="xforms:filename" minOccurs="0"/>
+                               <xsd:element ref="xforms:mediatype" minOccurs="0"/>
+                               -->
+                               <xsd:element name="filename" type="xforms:filename" minOccurs="0"/>
+                               <xsd:element name="mediatype" type="xforms:mediatype" minOccurs="0"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="mediatype" type="xsd:string" use="optional"/>
+                       <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="select1">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                               <xsd:group ref="xforms:List.UI.Common" maxOccurs="unbounded"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="selection" use="optional" default="closed">
+                               <xsd:simpleType>
+                                       <xsd:restriction base="xsd:string">
+                                               <xsd:enumeration value="open"/>
+                                               <xsd:enumeration value="closed"/>
+                                       </xsd:restriction>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+                       <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="true"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="select">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                               <xsd:group ref="xforms:List.UI.Common" maxOccurs="unbounded"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="selection" use="optional" default="closed">
+                               <xsd:simpleType>
+                                       <xsd:restriction base="xsd:string">
+                                               <xsd:enumeration value="open"/>
+                                               <xsd:enumeration value="closed"/>
+                                       </xsd:restriction>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+                       <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="true"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="range">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="start" type="xsd:string" use="optional"/>
+                       <xsd:attribute name="end" type="xsd:string" use="optional"/>
+                       <xsd:attribute name="step" type="xsd:string" use="optional"/>
+                       <xsd:attribute name="incremental" type="xsd:boolean" use="optional" default="false"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="trigger">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="output">
+               <xsd:complexType>
+                       <xsd:sequence minOccurs="0">
+                               <xsd:element ref="xforms:label"/>
+                               <!--
+                               <xsd:element ref="xforms:mediatype" minOccurs="0"/>
+                               -->
+                               <xsd:element name="mediatype" type="xforms:mediatypeWithValue" minOccurs="0"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attribute name="appearance" type="xforms:appearanceType" use="optional"/>
+                       <xsd:attribute name="value" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="mediatype" type="xsd:string" use="optional"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="submit">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label"/>
+                               <xsd:group ref="xforms:UI.Common" minOccurs="0" maxOccurs="unbounded"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="submission" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <!--
+Advanced User Interface
+-->
+       <xsd:attribute name="repeat-nodeset" type="xforms:XPathExpression"/>
+       <xsd:attribute name="repeat-model" type="xsd:IDREF"/>
+       <xsd:attribute name="repeat-bind" type="xsd:IDREF"/>
+       <xsd:attribute name="repeat-startindex" type="xsd:positiveInteger"/>
+       <xsd:attribute name="repeat-number" type="xsd:nonNegativeInteger"/>
+       
+       <xsd:element name="repeat">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+                                       <xsd:choice>
+                                               <xsd:group ref="xforms:Core.Form.Controls"/>
+                                               <xsd:group ref="xforms:Container.Form.Controls"/>
+                                               <xsd:group ref="xforms:Action"/>
+                                               <!-- containing document language to add additional allowed content here -->
+                                       </xsd:choice>
+                               </xsd:sequence>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+                       <xsd:attribute name="startindex" type="xsd:positiveInteger"/>
+                       <xsd:attribute name="number" type="xsd:nonNegativeInteger"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="group">
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <xsd:element ref="xforms:label" minOccurs="0"/>
+                               <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+                                       <xsd:choice>
+                                               <xsd:group ref="xforms:Core.Form.Controls"/>
+                                               <xsd:group ref="xforms:Container.Form.Controls"/>
+                                               <xsd:group ref="xforms:UI.Common"/>
+                                               <!-- containing document language to add additional allowed content here -->
+                                       </xsd:choice>
+                               </xsd:sequence>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="switch">
+               <xsd:complexType>
+                       <xsd:sequence maxOccurs="unbounded">
+                               <xsd:element name="case">
+                                       <xsd:complexType>
+                                               <xsd:sequence>
+                                                       <xsd:element ref="xforms:label" minOccurs="0"/>
+                                                       <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+                                                               <xsd:choice>
+                                                                       <xsd:group ref="xforms:Core.Form.Controls"/>
+                                                                       <xsd:group ref="xforms:Container.Form.Controls"/>
+                                                                       <xsd:group ref="xforms:Action"/>
+                                                                       <!-- containing document language to add additional allowed content here -->
+                                                               </xsd:choice>
+                                                       </xsd:sequence>
+                                               </xsd:sequence>
+                                               <xsd:attribute name="selected" type="xsd:boolean" use="optional" default="false"/>
+                                               <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                                       </xsd:complexType>
+                               </xsd:element>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:UI.Common.Attrs"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <!--
+XForms Actions
+-->
+
+       <xsd:attributeGroup name="XML.Events">
+               <xsd:attribute ref="ev:event"/>
+               <xsd:attribute ref="ev:observer"/>
+               <xsd:attribute ref="ev:target"/>
+               <xsd:attribute ref="ev:handler"/>
+               <xsd:attribute ref="ev:phase"/>
+               <xsd:attribute ref="ev:propagate"/>
+               <xsd:attribute ref="ev:defaultAction"/>
+       </xsd:attributeGroup>
+
+       <xsd:attributeGroup name="Common.Action.Attributes">
+               <xsd:annotation>
+                       <xsd:documentation>Attributes for _every_ action in XForms</xsd:documentation>
+               </xsd:annotation>
+               <xsd:attribute name="if" type="xforms:XPathExpression" use="optional"/>
+               <xsd:attribute name="while" type="xforms:XPathExpression" use="optional"/>
+       </xsd:attributeGroup>
+
+       <xsd:group name="Action">
+               <xsd:sequence>
+                       <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                               <xsd:element ref="xforms:action"/>
+                               <xsd:element ref="xforms:setvalue"/>
+                               <xsd:element ref="xforms:insert"/>
+                               <xsd:element ref="xforms:delete"/>
+                               <xsd:element ref="xforms:setindex"/>
+                               <xsd:element ref="xforms:toggle"/>
+                               <xsd:element ref="xforms:setfocus"/>
+                               <xsd:element ref="xforms:dispatch"/>
+                               <xsd:element ref="xforms:rebuild"/>
+                               <xsd:element ref="xforms:recalculate"/>
+                               <xsd:element ref="xforms:revalidate"/>
+                               <xsd:element ref="xforms:refresh"/>
+                               <xsd:element ref="xforms:reset"/>
+                               <xsd:element ref="xforms:load"/>
+                               <xsd:element ref="xforms:send"/>
+                               <xsd:element ref="xforms:message"/>
+                       </xsd:choice>
+               </xsd:sequence>
+       </xsd:group>
+
+       <xsd:element name="action">
+               <xsd:complexType>
+                       <xsd:sequence maxOccurs="unbounded">
+                               <xsd:group ref="xforms:Action"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="setvalue">
+               <xsd:complexType>
+                       <xsd:simpleContent>
+                               <xsd:extension base="xsd:string">
+                                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                                       <xsd:attribute name="value" type="xforms:XPathExpression" use="optional"/>
+                                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+                               </xsd:extension>
+                       </xsd:simpleContent>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="insert">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
+                       <xsd:attribute name="at" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="context" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="origin" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="position" use="optional">
+                               <xsd:simpleType>
+                                       <xsd:restriction base="xsd:string">
+                                               <xsd:enumeration value="before"/>
+                                               <xsd:enumeration value="after"/>
+                                       </xsd:restriction>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="delete">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Nodeset.Binding.Attributes"/>
+                       <xsd:attribute name="at" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="context" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="setindex">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="repeat" type="xsd:IDREF" use="required"/>
+                       <xsd:attribute name="index" type="xforms:XPathExpression" use="required"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="toggle">
+               <xsd:complexType>
+                       <xsd:sequence minOccurs="0" maxOccurs="1">
+                               <xsd:element name="case" type="xforms:ValueTemplate"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="case" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="setfocus">
+               <xsd:complexType>
+                       <xsd:sequence minOccurs="0" maxOccurs="1">
+                               <xsd:element name="control" type="xforms:ValueTemplate"/>
+                       </xsd:sequence>                 
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="control" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="dispatch">
+               <xsd:complexType>
+                       <!-- Need to be able to say only zero or one of each child, but order independent.
+                            This gets as close as possible with schema. -->
+                       <xsd:sequence minOccurs="0" maxOccurs="3">
+                           <xsd:choice>
+                               <xsd:element name="name" type="xforms:ValueTemplate"/>
+                               <xsd:element name="targetid" type="xforms:ValueTemplate"/>
+                               <xsd:element name="target" type="xforms:ValueTemplate"/>
+                               <xsd:element name="delay" type="xforms:ValueTemplate"/>
+                           </xsd:choice>
+                       </xsd:sequence>                         
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="name" type="xsd:NMTOKEN" use="optional"/>
+                       <xsd:attribute name="targetid" type="xsd:IDREF" use="optional"/>
+                       <xsd:attribute name="target" type="xsd:IDREF" use="optional"/>
+                       <xsd:attribute name="delay" type="xsd:string" use="optional" default=""/>
+                       <xsd:attribute name="bubbles" type="xsd:boolean" use="optional" default="true"/>
+                       <xsd:attribute name="cancelable" type="xsd:boolean" use="optional" default="true"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="rebuild">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="recalculate">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="revalidate">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="refresh">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="reset">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+                       <xsd:attribute name="model" type="xsd:IDREF" use="optional"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="load">
+               <xsd:complexType>
+                       <xsd:sequence minOccurs="0" maxOccurs="1">
+                               <xsd:element name="resource" type="xforms:ValueTemplate"/>
+                       </xsd:sequence>                 
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attribute name="resource" type="xsd:anyURI" use="optional"/>
+                       <xsd:attribute name="show" use="optional" default="replace">
+                               <xsd:simpleType>
+                                       <xsd:restriction base="xsd:string">
+                                               <xsd:enumeration value="new"/>
+                                               <xsd:enumeration value="replace"/>
+                                       </xsd:restriction>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="send">
+               <xsd:complexType>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attribute name="submission" type="xsd:IDREF" use="optional"/>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+       <xsd:element name="message">
+               <xsd:complexType mixed="true">
+                       <xsd:group ref="xforms:UI.Content"/>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       <xsd:attributeGroup ref="xforms:Single.Node.Binding.Attributes"/>
+                       <xsd:attribute name="level" use="optional" default="modal">
+                               <xsd:simpleType>
+                                       <xsd:union memberTypes="xforms:QNameButNotNCNAME">
+                                               <xsd:simpleType>
+                                                       <xsd:restriction base="xsd:string">
+                                                               <xsd:enumeration value="ephemeral"/>
+                                                               <xsd:enumeration value="modeless"/>
+                                                               <xsd:enumeration value="modal"/>
+                                                       </xsd:restriction>
+                                               </xsd:simpleType>
+                                       </xsd:union>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+                       <xsd:attributeGroup ref="xforms:XML.Events"/>
+                       <xsd:attributeGroup ref="xforms:Common.Action.Attributes"/>
+               </xsd:complexType>
+       </xsd:element>
+
+       <xsd:element name="submission">
+               <xsd:annotation>
+                       <xsd:documentation>submit info container.</xsd:documentation>
+               </xsd:annotation>
+               <xsd:complexType>
+                       <xsd:sequence>
+                               <!-- There should only be zero or one resource, zero or one method, and zero or more header 
+                                    We can't say exactly this, but we get as close as possible -->
+                               <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                                       <xsd:element name="resource" type="xforms:ValueTemplate"/>
+                                       <xsd:element name="method" type="xforms:ValueTemplate"/>
+                                       <xsd:element name="header">
+                                               <xsd:complexType>
+                                                       <!-- Both name and value+ are required, but order independent -->
+                                                       <xsd:choice>
+                                                            <xsd:sequence>
+                                                                    <xsd:element name="name" type="xforms:ValueTemplate" />
+                                                                    <xsd:element name="value" type="xforms:ValueTemplate"
+                                        minOccurs="1" maxOccurs="unbounded" />
+                                                            </xsd:sequence>
+                                                            <xsd:sequence>
+                                                                    <xsd:element name="value" type="xforms:ValueTemplate"
+                                        minOccurs="1" maxOccurs="unbounded" />
+                                                                    <xsd:element name="name" type="xforms:ValueTemplate" />
+                                                            </xsd:sequence>
+                                                       </xsd:choice>
+                    <xsd:attribute name="combine" use="optional" default="append">
+                            <xsd:simpleType>
+                                    <xsd:restriction base="xsd:string">
+                                            <xsd:enumeration value="append"/>
+                                            <xsd:enumeration value="prepend"/>
+                                            <xsd:enumeration value="replace"/>
+                                    </xsd:restriction>
+                            </xsd:simpleType>
+                    </xsd:attribute>
+                                               </xsd:complexType>
+                                       </xsd:element>
+                               </xsd:choice>
+                               <!-- As is the case everywhere else, action handlers are last -->
+                               <xsd:group ref="xforms:Action"/>
+                       </xsd:sequence>
+                       <xsd:attributeGroup ref="xforms:Common.Attributes"/>
+                       
+                       <xsd:attribute name="ref" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="bind" type="xsd:IDREF" use="optional"/>
+                       
+                       <!-- Either the resource attribute, action attribute, or resource child element is required -->
+                       <xsd:attribute name="resource" type="xsd:anyURI" use="optional"/>
+                       <xsd:attribute name="action" type="xsd:anyURI" use="optional"/>
+                       
+                       <xsd:attribute name="mode" use="optional" default="asynchronous">
+                               <xsd:simpleType>
+                                       <xsd:restriction base="xsd:string">
+                                               <xsd:enumeration value="asynchronous"/>
+                                               <xsd:enumeration value="synchronous"/>
+                                       </xsd:restriction>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+
+                       <!-- Either the method attribute or the method child element is required -->
+                       <xsd:attribute name="method" use="optional">
+                               <xsd:simpleType>
+                                       <xsd:union memberTypes="xforms:QNameButNotNCNAME xsd:NCName">
+                                               <xsd:simpleType>
+                                                       <xsd:restriction base="xsd:string">
+                                                               <xsd:enumeration value="post"/>
+                                                               <xsd:enumeration value="put"/>
+                                                               <xsd:enumeration value="get"/>
+                                                               <xsd:enumeration value="delete"/>
+                                                               <xsd:enumeration value="multipart-post"/>
+                                                               <xsd:enumeration value="form-data-post"/>
+                                                               <xsd:enumeration value="urlencoded-post"/>
+                                                       </xsd:restriction>
+                                               </xsd:simpleType>
+                                       </xsd:union>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+
+                        <!-- The defaults for these are false if serialization is 'none' and true otherwise -->
+                       <xsd:attribute name="validate" type="xsd:boolean" use="optional"/>
+                       <xsd:attribute name="relevant" type="xsd:boolean" use="optional"/>
+                       
+                       <!-- The default is based on the selected method, e.g. application/xml for the post method -->
+                       <xsd:attribute name="serialization" type="xsd:string" use="optional"/>
+                       
+                       <xsd:attribute name="version" type="xsd:NMTOKEN" use="optional" default="1.0"/>
+                       <xsd:attribute name="indent" type="xsd:boolean" use="optional" default="false"/>
+                       <xsd:attribute name="mediatype" type="xsd:string" use="optional" default="application/xml"/>
+                       <xsd:attribute name="encoding" type="xsd:string" use="optional" default="UTF-8"/>
+                       
+                       <xsd:attribute name="omit-xml-declaration" type="xsd:boolean" use="optional" default="false"/>
+                       <!-- This is optional with no default because omitting the attribute behaves differently 
+                            than including it with any value -->
+                       <xsd:attribute name="standalone" type="xsd:boolean" use="optional"/>
+                       
+                       <xsd:attribute name="cdata-section-elements" type="xforms:QNameList" use="optional" default=""/>
+                       
+                       <xsd:attribute name="replace" use="optional" default="all">
+                               <xsd:simpleType>
+                                       <xsd:union memberTypes="xforms:QNameButNotNCNAME">
+                                               <xsd:simpleType>
+                                                       <xsd:restriction base="xsd:string">
+                                                               <xsd:enumeration value="all"/>
+                                                               <xsd:enumeration value="instance"/>
+                                                               <xsd:enumeration value="text"/>
+                                                               <xsd:enumeration value="none"/>
+                                                       </xsd:restriction>
+                                               </xsd:simpleType>
+                                       </xsd:union>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+                       
+                       <!-- Default is not specified because the default is to replace the instance being submitted -->
+                       <xsd:attribute name="instance" type="xsd:IDREF" use="optional"/>
+                       
+                       <xsd:attribute name="separator" use="optional" default="&amp;">
+                               <xsd:simpleType>
+                                       <xsd:restriction base="xsd:string">
+                                               <xsd:enumeration value="&amp;"/>
+                                               <xsd:enumeration value=";"/>
+                                       </xsd:restriction>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+                       
+                       <!-- Default is not specified because the defalut is to replace the whole instance indicated 
+                            by the instance attribute -->
+                       <xsd:attribute name="targetref" type="xforms:XPathExpression" use="optional"/>
+                       <xsd:attribute name="target" type="xforms:XPathExpression" use="optional"/>
+                       
+                       <!-- Default not specified because omitting the attribute behaves differently than
+                            including it with any value -->
+                       <xsd:attribute name="includenamespaceprefixes" use="optional">
+                               <xsd:simpleType>
+                                       <xsd:list>
+                                               <xsd:simpleType>
+                                                       <xsd:union memberTypes="xsd:NCName">
+                                                               <xsd:simpleType>
+                                                                       <xsd:restriction base="xsd:string">
+                                                                               <xsd:enumeration value="#default"/>
+                                                                       </xsd:restriction>
+                                                               </xsd:simpleType>
+                                                       </xsd:union>
+                                               </xsd:simpleType>
+                                       </xsd:list>
+                               </xsd:simpleType>
+                       </xsd:attribute>
+               </xsd:complexType>
+       </xsd:element>
+
+        <!-- 
+Internal helper types 
+-->
+
+       <xsd:simpleType name="versionList">
+               <xsd:list itemType="xforms:versionNumber"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="versionNumber">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="[1-9]\d*\.\d+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="XPathExpression">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="QNameList">
+               <xsd:list itemType="xsd:QName"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="anyURIList">
+               <xsd:list itemType="xsd:anyURI"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="QNameButNotNCNAME">
+               <xsd:restriction base="xsd:QName">
+                       <xsd:pattern value="[^:]+:[^:]+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="appearanceType">
+               <xsd:union memberTypes="xforms:QNameButNotNCNAME">
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:enumeration value="full"/>
+                                       <xsd:enumeration value="compact"/>
+                                       <xsd:enumeration value="minimal"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+
+       <xsd:complexType name="ValueTemplate">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attribute name="value" type="xforms:XPathExpression" use="optional"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+
+        <!--
+New simpleTypes provided to form authors
+-->
+
+       <xsd:simpleType name="listItem">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="\S+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="listItems">
+               <xsd:list itemType="xforms:listItem"/>
+        </xsd:simpleType>
+
+       <xsd:simpleType name="dateTime">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:dateTime"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="time">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:time"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="date">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:date"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="duration">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:duration"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="gYearMonth">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:gYearMonth"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="gYear">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:gYear"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="gMonthDay">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:gMonthDay"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="gDay">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:gDay"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="gMonth">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:gMonth"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="string">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="boolean">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:boolean"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="base64Binary">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:base64Binary"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="hexBinary">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:hexBinary"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="float">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:float"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="decimal">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:decimal"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="double">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:double"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="anyURI">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:anyURI"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="QName">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:QName"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="normalizedString">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:normalizedString"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="token">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:token"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="language">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:language"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="Name">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:Name"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="NCName">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:NCName"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="ID">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:ID"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="IDREF">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:IDREF"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="IDREFS">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:IDREFS"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="NMTOKEN">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:NMTOKEN"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="NMTOKENS">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:NMTOKENS"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="integer">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:integer"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="negativeInteger">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:negativeInteger"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="long">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:long"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="int">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:int"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="short">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:short"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="byte">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:byte"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="nonNegativeInteger">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:nonNegativeInteger"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="unsignedLong">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:unsignedLong"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="unsignedInt">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:unsignedInt"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="unsignedShort">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:unsignedShort"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="unsignedByte">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:unsignedByte"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="positiveInteger">
+               <xsd:union>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:positiveInteger"/>
+                       </xsd:simpleType>
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:length value="0"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:union>
+       </xsd:simpleType>
+       
+       <xsd:simpleType name="dayTimeDuration">
+               <xsd:restriction base="xsd:duration">
+                       <xsd:pattern value="([\-]?P([0-9]+D(T([0-9]+(H([0-9]+(M([0-9]+(\.[0-9]*)?S
+                       |\.[0-9]+S)?|(\.[0-9]*)?S)|(\.[0-9]*)?S)?|M([0-9]+
+                       (\.[0-9]*)?S|\.[0-9]+S)?|(\.[0-9]*)?S)|\.[0-9]+S))?
+                       |T([0-9]+(H([0-9]+(M([0-9]+(\.[0-9]*)?S|\.[0-9]+S)?
+                       |(\.[0-9]*)?S)|(\.[0-9]*)?S)?|M([0-9]+(\.[0-9]*)?S|\.[0-9]+S)?
+                       |(\.[0-9]*)?S)|\.[0-9]+S)))?"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+
+       <xsd:simpleType name="yearMonthDuration">
+               <xsd:restriction base="xsd:duration">
+                       <xsd:pattern value="([\-]?P[0-9]+(Y([0-9]+M)?|M))?"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="email">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([A-Za-z0-9!#-'\*\+\-/=\?\^_`\{-~]+(\.[A-Za-z0-9!#-'\*\+\-/=\?\^_`\{-~]+)*@[A-Za-z0-9!#-'\*\+\-/=\?\^_`\{-~]+(\.[A-Za-z0-9!#-'\*\+\-/=\?\^_`\{-~]+)*)?"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+
+       <xsd:simpleType name="card-number">
+               <xsd:annotation>
+                       <xsd:documentation>
+                       This type defines the basic lexical properties for a dataypte that can be used to represent
+                       various ID numbers such as for debit and credit cards.
+                       This type does not apply the Luhn checksum algorithm.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="[0-9]*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+
+
+</xsd:schema>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/XMLSchema.dtd b/org.argeo.app.core/src/org/argeo/app/core/schemas/XMLSchema.dtd
new file mode 100644 (file)
index 0000000..e8e8f76
--- /dev/null
@@ -0,0 +1,402 @@
+<!-- DTD for XML Schemas: Part 1: Structures
+     Public Identifier: "-//W3C//DTD XMLSCHEMA 200102//EN"
+     Official Location: http://www.w3.org/2001/XMLSchema.dtd -->
+<!-- $Id: XMLSchema.dtd,v 1.31 2001/10/24 15:50:16 ht Exp $ -->
+<!-- Note this DTD is NOT normative, or even definitive. -->           <!--d-->
+<!-- prose copy in the structures REC is the definitive version -->    <!--d-->
+<!-- (which shouldn't differ from this one except for this -->         <!--d-->
+<!-- comment and entity expansions, but just in case) -->              <!--d-->
+<!-- With the exception of cases with multiple namespace
+     prefixes for the XML Schema namespace, any XML document which is
+     not valid per this DTD given redefinitions in its internal subset of the
+     'p' and 's' parameter entities below appropriate to its namespace
+     declaration of the XML Schema namespace is almost certainly not
+     a valid schema. -->
+
+<!-- The simpleType element and its constituent parts
+     are defined in XML Schema: Part 2: Datatypes -->
+<!ENTITY % xs-datatypes PUBLIC 'datatypes' 'datatypes.dtd' >
+
+<!ENTITY % p 'xs:'> <!-- can be overriden in the internal subset of a
+                         schema document to establish a different
+                         namespace prefix -->
+<!ENTITY % s ':xs'> <!-- if %p is defined (e.g. as foo:) then you must
+                         also define %s as the suffix for the appropriate
+                         namespace declaration (e.g. :foo) -->
+<!ENTITY % nds 'xmlns%s;'>
+
+<!-- Define all the element names, with optional prefix -->
+<!ENTITY % schema "%p;schema">
+<!ENTITY % complexType "%p;complexType">
+<!ENTITY % complexContent "%p;complexContent">
+<!ENTITY % simpleContent "%p;simpleContent">
+<!ENTITY % extension "%p;extension">
+<!ENTITY % element "%p;element">
+<!ENTITY % unique "%p;unique">
+<!ENTITY % key "%p;key">
+<!ENTITY % keyref "%p;keyref">
+<!ENTITY % selector "%p;selector">
+<!ENTITY % field "%p;field">
+<!ENTITY % group "%p;group">
+<!ENTITY % all "%p;all">
+<!ENTITY % choice "%p;choice">
+<!ENTITY % sequence "%p;sequence">
+<!ENTITY % any "%p;any">
+<!ENTITY % anyAttribute "%p;anyAttribute">
+<!ENTITY % attribute "%p;attribute">
+<!ENTITY % attributeGroup "%p;attributeGroup">
+<!ENTITY % include "%p;include">
+<!ENTITY % import "%p;import">
+<!ENTITY % redefine "%p;redefine">
+<!ENTITY % notation "%p;notation">
+
+<!-- annotation elements -->
+<!ENTITY % annotation "%p;annotation">
+<!ENTITY % appinfo "%p;appinfo">
+<!ENTITY % documentation "%p;documentation">
+
+<!-- Customisation entities for the ATTLIST of each element type.
+     Define one of these if your schema takes advantage of the
+     anyAttribute='##other' in the schema for schemas -->
+
+<!ENTITY % schemaAttrs ''>
+<!ENTITY % complexTypeAttrs ''>
+<!ENTITY % complexContentAttrs ''>
+<!ENTITY % simpleContentAttrs ''>
+<!ENTITY % extensionAttrs ''>
+<!ENTITY % elementAttrs ''>
+<!ENTITY % groupAttrs ''>
+<!ENTITY % allAttrs ''>
+<!ENTITY % choiceAttrs ''>
+<!ENTITY % sequenceAttrs ''>
+<!ENTITY % anyAttrs ''>
+<!ENTITY % anyAttributeAttrs ''>
+<!ENTITY % attributeAttrs ''>
+<!ENTITY % attributeGroupAttrs ''>
+<!ENTITY % uniqueAttrs ''>
+<!ENTITY % keyAttrs ''>
+<!ENTITY % keyrefAttrs ''>
+<!ENTITY % selectorAttrs ''>
+<!ENTITY % fieldAttrs ''>
+<!ENTITY % includeAttrs ''>
+<!ENTITY % importAttrs ''>
+<!ENTITY % redefineAttrs ''>
+<!ENTITY % notationAttrs ''>
+<!ENTITY % annotationAttrs ''>
+<!ENTITY % appinfoAttrs ''>
+<!ENTITY % documentationAttrs ''>
+
+<!ENTITY % complexDerivationSet "CDATA">
+      <!-- #all or space-separated list drawn from derivationChoice -->
+<!ENTITY % blockSet "CDATA">
+      <!-- #all or space-separated list drawn from
+                      derivationChoice + 'substitution' -->
+
+<!ENTITY % mgs '%all; | %choice; | %sequence;'>
+<!ENTITY % cs '%choice; | %sequence;'>
+<!ENTITY % formValues '(qualified|unqualified)'>
+
+
+<!ENTITY % attrDecls    '((%attribute;| %attributeGroup;)*,(%anyAttribute;)?)'>
+
+<!ENTITY % particleAndAttrs '((%mgs; | %group;)?, %attrDecls;)'>
+
+<!-- This is used in part2 -->
+<!ENTITY % restriction1 '((%mgs; | %group;)?)'>
+
+%xs-datatypes;
+
+<!-- the duplication below is to produce an unambiguous content model
+     which allows annotation everywhere -->
+<!ELEMENT %schema; ((%include; | %import; | %redefine; | %annotation;)*,
+                    ((%simpleType; | %complexType;
+                      | %element; | %attribute;
+                      | %attributeGroup; | %group;
+                      | %notation; ),
+                     (%annotation;)*)* )>
+<!ATTLIST %schema;
+   targetNamespace      %URIref;               #IMPLIED
+   version              CDATA                  #IMPLIED
+   %nds;                %URIref;               #FIXED 'http://www.w3.org/2001/XMLSchema'
+   xmlns                CDATA                  #IMPLIED
+   finalDefault         %complexDerivationSet; ''
+   blockDefault         %blockSet;             ''
+   id                   ID                     #IMPLIED
+   elementFormDefault   %formValues;           'unqualified'
+   attributeFormDefault %formValues;           'unqualified'
+   xml:lang             CDATA                  #IMPLIED
+   %schemaAttrs;>
+<!-- Note the xmlns declaration is NOT in the Schema for Schemas,
+     because at the Infoset level where schemas operate,
+     xmlns(:prefix) is NOT an attribute! -->
+<!-- The declaration of xmlns is a convenience for schema authors -->
+<!-- The id attribute here and below is for use in external references
+     from non-schemas using simple fragment identifiers.
+     It is NOT used for schema-to-schema reference, internal or
+     external. -->
+
+<!-- a type is a named content type specification which allows attribute
+     declarations-->
+<!-- -->
+
+<!ELEMENT %complexType; ((%annotation;)?,
+                         (%simpleContent;|%complexContent;|
+                          %particleAndAttrs;))>
+
+<!ATTLIST %complexType;
+          name      %NCName;                        #IMPLIED
+          id        ID                              #IMPLIED
+          abstract  %boolean;                       #IMPLIED
+          final     %complexDerivationSet;          #IMPLIED
+          block     %complexDerivationSet;          #IMPLIED
+          mixed (true|false) 'false'
+          %complexTypeAttrs;>
+
+<!-- particleAndAttrs is shorthand for a root type -->
+<!-- mixed is disallowed if simpleContent, overriden if complexContent
+     has one too. -->
+
+<!-- If anyAttribute appears in one or more referenced attributeGroups
+     and/or explicitly, the intersection of the permissions is used -->
+
+<!ELEMENT %complexContent; ((%annotation;)?, (%restriction;|%extension;))>
+<!ATTLIST %complexContent;
+          mixed (true|false) #IMPLIED
+          id    ID           #IMPLIED
+          %complexContentAttrs;>
+
+<!-- restriction should use the branch defined above, not the simple
+     one from part2; extension should use the full model  -->
+
+<!ELEMENT %simpleContent; ((%annotation;)?, (%restriction;|%extension;))>
+<!ATTLIST %simpleContent;
+          id    ID           #IMPLIED
+          %simpleContentAttrs;>
+
+<!-- restriction should use the simple branch from part2, not the 
+     one defined above; extension should have no particle  -->
+
+<!ELEMENT %extension; ((%annotation;)?, (%particleAndAttrs;))>
+<!ATTLIST %extension;
+          base  %QName;      #REQUIRED
+          id    ID           #IMPLIED
+          %extensionAttrs;>
+
+<!-- an element is declared by either:
+ a name and a type (either nested or referenced via the type attribute)
+ or a ref to an existing element declaration -->
+
+<!ELEMENT %element; ((%annotation;)?, (%complexType;| %simpleType;)?,
+                     (%unique; | %key; | %keyref;)*)>
+<!-- simpleType or complexType only if no type|ref attribute -->
+<!-- ref not allowed at top level -->
+<!ATTLIST %element;
+            name               %NCName;               #IMPLIED
+            id                 ID                     #IMPLIED
+            ref                %QName;                #IMPLIED
+            type               %QName;                #IMPLIED
+            minOccurs          %nonNegativeInteger;   #IMPLIED
+            maxOccurs          CDATA                  #IMPLIED
+            nillable           %boolean;              #IMPLIED
+            substitutionGroup  %QName;                #IMPLIED
+            abstract           %boolean;              #IMPLIED
+            final              %complexDerivationSet; #IMPLIED
+            block              %blockSet;             #IMPLIED
+            default            CDATA                  #IMPLIED
+            fixed              CDATA                  #IMPLIED
+            form               %formValues;           #IMPLIED
+            %elementAttrs;>
+<!-- type and ref are mutually exclusive.
+     name and ref are mutually exclusive, one is required -->
+<!-- In the absence of type AND ref, type defaults to type of
+     substitutionGroup, if any, else the ur-type, i.e. unconstrained -->
+<!-- default and fixed are mutually exclusive -->
+
+<!ELEMENT %group; ((%annotation;)?,(%mgs;)?)>
+<!ATTLIST %group; 
+          name        %NCName;               #IMPLIED
+          ref         %QName;                #IMPLIED
+          minOccurs   %nonNegativeInteger;   #IMPLIED
+          maxOccurs   CDATA                  #IMPLIED
+          id          ID                     #IMPLIED
+          %groupAttrs;>
+
+<!ELEMENT %all; ((%annotation;)?, (%element;)*)>
+<!ATTLIST %all;
+          minOccurs   (1)                    #IMPLIED
+          maxOccurs   (1)                    #IMPLIED
+          id          ID                     #IMPLIED
+          %allAttrs;>
+
+<!ELEMENT %choice; ((%annotation;)?, (%element;| %group;| %cs; | %any;)*)>
+<!ATTLIST %choice;
+          minOccurs   %nonNegativeInteger;   #IMPLIED
+          maxOccurs   CDATA                  #IMPLIED
+          id          ID                     #IMPLIED
+          %choiceAttrs;>
+
+<!ELEMENT %sequence; ((%annotation;)?, (%element;| %group;| %cs; | %any;)*)>
+<!ATTLIST %sequence;
+          minOccurs   %nonNegativeInteger;   #IMPLIED
+          maxOccurs   CDATA                  #IMPLIED
+          id          ID                     #IMPLIED
+          %sequenceAttrs;>
+
+<!-- an anonymous grouping in a model, or
+     a top-level named group definition, or a reference to same -->
+
+<!-- Note that if order is 'all', group is not allowed inside.
+     If order is 'all' THIS group must be alone (or referenced alone) at
+     the top level of a content model -->
+<!-- If order is 'all', minOccurs==maxOccurs==1 on element/any inside -->
+<!-- Should allow minOccurs=0 inside order='all' . . . -->
+
+<!ELEMENT %any; (%annotation;)?>
+<!ATTLIST %any;
+            namespace       CDATA                  '##any'
+            processContents (skip|lax|strict)      'strict'
+            minOccurs       %nonNegativeInteger;   '1'
+            maxOccurs       CDATA                  '1'
+            id              ID                     #IMPLIED
+            %anyAttrs;>
+
+<!-- namespace is interpreted as follows:
+                  ##any      - - any non-conflicting WFXML at all
+
+                  ##other    - - any non-conflicting WFXML from namespace other
+                                  than targetNamespace
+
+                  ##local    - - any unqualified non-conflicting WFXML/attribute
+                  one or     - - any non-conflicting WFXML from
+                  more URI        the listed namespaces
+                  references
+
+                  ##targetNamespace ##local may appear in the above list,
+                    with the obvious meaning -->
+
+<!ELEMENT %anyAttribute; (%annotation;)?>
+<!ATTLIST %anyAttribute;
+            namespace       CDATA              '##any'
+            processContents (skip|lax|strict)  'strict'
+            id              ID                 #IMPLIED
+            %anyAttributeAttrs;>
+<!-- namespace is interpreted as for 'any' above -->
+
+<!-- simpleType only if no type|ref attribute -->
+<!-- ref not allowed at top level, name iff at top level -->
+<!ELEMENT %attribute; ((%annotation;)?, (%simpleType;)?)>
+<!ATTLIST %attribute;
+          name      %NCName;      #IMPLIED
+          id        ID            #IMPLIED
+          ref       %QName;       #IMPLIED
+          type      %QName;       #IMPLIED
+          use       (prohibited|optional|required) #IMPLIED
+          default   CDATA         #IMPLIED
+          fixed     CDATA         #IMPLIED
+          form      %formValues;  #IMPLIED
+          %attributeAttrs;>
+<!-- type and ref are mutually exclusive.
+     name and ref are mutually exclusive, one is required -->
+<!-- default for use is optional when nested, none otherwise -->
+<!-- default and fixed are mutually exclusive -->
+<!-- type attr and simpleType content are mutually exclusive -->
+
+<!-- an attributeGroup is a named collection of attribute decls, or a
+     reference thereto -->
+<!ELEMENT %attributeGroup; ((%annotation;)?,
+                       (%attribute; | %attributeGroup;)*,
+                       (%anyAttribute;)?) >
+<!ATTLIST %attributeGroup;
+                 name       %NCName;       #IMPLIED
+                 id         ID             #IMPLIED
+                 ref        %QName;        #IMPLIED
+                 %attributeGroupAttrs;>
+
+<!-- ref iff no content, no name.  ref iff not top level -->
+
+<!-- better reference mechanisms -->
+<!ELEMENT %unique; ((%annotation;)?, %selector;, (%field;)+)>
+<!ATTLIST %unique;
+          name     %NCName;       #REQUIRED
+         id       ID             #IMPLIED
+         %uniqueAttrs;>
+
+<!ELEMENT %key;    ((%annotation;)?, %selector;, (%field;)+)>
+<!ATTLIST %key;
+          name     %NCName;       #REQUIRED
+         id       ID             #IMPLIED
+         %keyAttrs;>
+
+<!ELEMENT %keyref; ((%annotation;)?, %selector;, (%field;)+)>
+<!ATTLIST %keyref;
+          name     %NCName;       #REQUIRED
+         refer    %QName;        #REQUIRED
+         id       ID             #IMPLIED
+         %keyrefAttrs;>
+
+<!ELEMENT %selector; ((%annotation;)?)>
+<!ATTLIST %selector;
+          xpath %XPathExpr; #REQUIRED
+          id    ID          #IMPLIED
+          %selectorAttrs;>
+<!ELEMENT %field; ((%annotation;)?)>
+<!ATTLIST %field;
+          xpath %XPathExpr; #REQUIRED
+          id    ID          #IMPLIED
+          %fieldAttrs;>
+
+<!-- Schema combination mechanisms -->
+<!ELEMENT %include; (%annotation;)?>
+<!ATTLIST %include;
+          schemaLocation %URIref; #REQUIRED
+          id             ID       #IMPLIED
+          %includeAttrs;>
+
+<!ELEMENT %import; (%annotation;)?>
+<!ATTLIST %import;
+          namespace      %URIref; #IMPLIED
+          schemaLocation %URIref; #IMPLIED
+          id             ID       #IMPLIED
+          %importAttrs;>
+
+<!ELEMENT %redefine; (%annotation; | %simpleType; | %complexType; |
+                      %attributeGroup; | %group;)*>
+<!ATTLIST %redefine;
+          schemaLocation %URIref; #REQUIRED
+          id             ID       #IMPLIED
+          %redefineAttrs;>
+
+<!ELEMENT %notation; (%annotation;)?>
+<!ATTLIST %notation;
+         name        %NCName;    #REQUIRED
+         id          ID          #IMPLIED
+         public      CDATA       #REQUIRED
+         system      %URIref;    #IMPLIED
+         %notationAttrs;>
+
+<!-- Annotation is either application information or documentation -->
+<!-- By having these here they are available for datatypes as well
+     as all the structures elements -->
+
+<!ELEMENT %annotation; (%appinfo; | %documentation;)*>
+<!ATTLIST %annotation; %annotationAttrs;>
+
+<!-- User must define annotation elements in internal subset for this
+     to work -->
+<!ELEMENT %appinfo; ANY>   <!-- too restrictive -->
+<!ATTLIST %appinfo;
+          source     %URIref;      #IMPLIED
+          id         ID         #IMPLIED
+          %appinfoAttrs;>
+<!ELEMENT %documentation; ANY>   <!-- too restrictive -->
+<!ATTLIST %documentation;
+          source     %URIref;   #IMPLIED
+          id         ID         #IMPLIED
+          xml:lang   CDATA      #IMPLIED
+          %documentationAttrs;>
+
+<!NOTATION XMLSchemaStructures PUBLIC
+           'structures' 'http://www.w3.org/2001/XMLSchema.xsd' >
+<!NOTATION XML PUBLIC
+           'REC-xml-1998-0210' 'http://www.w3.org/TR/1998/REC-xml-19980210' >
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/XMLSchema.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/XMLSchema.xsd
new file mode 100644 (file)
index 0000000..12c2209
--- /dev/null
@@ -0,0 +1,2534 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- XML Schema schema for XML Schemas: Part 1: Structures -->
+<!-- Note this schema is NOT the normative structures schema. -->
+<!-- The prose copy in the structures REC is the normative -->
+<!-- version (which shouldn't differ from this one except for -->
+<!-- this comment and entity expansions, but just in case -->
+<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" [
+
+<!-- provide ID type information even for parsers which only read the
+     internal subset -->
+<!ATTLIST xs:schema          id  ID  #IMPLIED>
+<!ATTLIST xs:complexType     id  ID  #IMPLIED>
+<!ATTLIST xs:complexContent  id  ID  #IMPLIED>
+<!ATTLIST xs:simpleContent   id  ID  #IMPLIED>
+<!ATTLIST xs:extension       id  ID  #IMPLIED>
+<!ATTLIST xs:element         id  ID  #IMPLIED>
+<!ATTLIST xs:group           id  ID  #IMPLIED> 
+<!ATTLIST xs:all             id  ID  #IMPLIED>
+<!ATTLIST xs:choice          id  ID  #IMPLIED>
+<!ATTLIST xs:sequence        id  ID  #IMPLIED>
+<!ATTLIST xs:any             id  ID  #IMPLIED>
+<!ATTLIST xs:anyAttribute    id  ID  #IMPLIED>
+<!ATTLIST xs:attribute       id  ID  #IMPLIED>
+<!ATTLIST xs:attributeGroup  id  ID  #IMPLIED>
+<!ATTLIST xs:unique          id  ID  #IMPLIED>
+<!ATTLIST xs:key             id  ID  #IMPLIED>
+<!ATTLIST xs:keyref          id  ID  #IMPLIED>
+<!ATTLIST xs:selector        id  ID  #IMPLIED>
+<!ATTLIST xs:field           id  ID  #IMPLIED>
+<!ATTLIST xs:include         id  ID  #IMPLIED>
+<!ATTLIST xs:import          id  ID  #IMPLIED>
+<!ATTLIST xs:redefine        id  ID  #IMPLIED>
+<!ATTLIST xs:notation        id  ID  #IMPLIED>
+<!--
+     keep this schema XML1.0 DTD valid
+  -->
+        <!ENTITY % schemaAttrs 'xmlns:hfp CDATA #IMPLIED'>
+
+        <!ELEMENT hfp:hasFacet EMPTY>
+        <!ATTLIST hfp:hasFacet
+                name NMTOKEN #REQUIRED>
+
+        <!ELEMENT hfp:hasProperty EMPTY>
+        <!ATTLIST hfp:hasProperty
+                name NMTOKEN #REQUIRED
+                value CDATA #REQUIRED>
+<!--
+        Make sure that processors that do not read the external
+        subset will know about the various IDs we declare
+  -->
+        <!ATTLIST xs:simpleType id ID #IMPLIED>
+        <!ATTLIST xs:maxExclusive id ID #IMPLIED>
+        <!ATTLIST xs:minExclusive id ID #IMPLIED>
+        <!ATTLIST xs:maxInclusive id ID #IMPLIED>
+        <!ATTLIST xs:minInclusive id ID #IMPLIED>
+        <!ATTLIST xs:totalDigits id ID #IMPLIED>
+        <!ATTLIST xs:fractionDigits id ID #IMPLIED>
+        <!ATTLIST xs:length id ID #IMPLIED>
+        <!ATTLIST xs:minLength id ID #IMPLIED>
+        <!ATTLIST xs:maxLength id ID #IMPLIED>
+        <!ATTLIST xs:enumeration id ID #IMPLIED>
+        <!ATTLIST xs:pattern id ID #IMPLIED>
+        <!ATTLIST xs:appinfo id ID #IMPLIED>
+        <!ATTLIST xs:documentation id ID #IMPLIED>
+        <!ATTLIST xs:list id ID #IMPLIED>
+        <!ATTLIST xs:union id ID #IMPLIED>
+        ]>
+<xs:schema targetNamespace="http://www.w3.org/2001/XMLSchema" blockDefault="#all" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="EN" xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
+ <xs:annotation>
+  <xs:documentation>
+    Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp 
+    Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp 
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/2004/PER-xmlschema-1-20040318/structures.html">
+   The schema corresponding to this document is normative,
+   with respect to the syntactic constraints it expresses in the
+   XML Schema language.  The documentation (within &lt;documentation> elements)
+   below, is not normative, but rather highlights important aspects of
+   the W3C Recommendation of which this is a part</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+   <xs:documentation>
+   The simpleType element and all of its members are defined
+      towards the end of this schema document</xs:documentation>
+ </xs:annotation>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd">
+   <xs:annotation>
+     <xs:documentation>
+       Get access to the xml: attribute groups for xml:lang
+       as declared on 'schema' and 'documentation' below
+     </xs:documentation>
+   </xs:annotation>
+ </xs:import>
+
+ <xs:complexType name="openAttrs">
+   <xs:annotation>
+     <xs:documentation>
+       This type is extended by almost all schema types
+       to allow attributes from other namespaces to be
+       added to user schemas.
+     </xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+     <xs:restriction base="xs:anyType">
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+     </xs:restriction>
+   </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="annotated">
+   <xs:annotation>
+     <xs:documentation>
+       This type is extended by all types which allow annotation
+       other than &lt;schema&gt; itself
+     </xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+     <xs:extension base="xs:openAttrs">
+       <xs:sequence>
+         <xs:element ref="xs:annotation" minOccurs="0"/>
+       </xs:sequence>
+       <xs:attribute name="id" type="xs:ID"/>
+     </xs:extension>
+   </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="schemaTop">
+  <xs:annotation>
+   <xs:documentation>
+   This group is for the
+   elements which occur freely at the top level of schemas.
+   All of their types are based on the "annotated" type by extension.</xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:group ref="xs:redefinable"/>
+   <xs:element ref="xs:element"/>
+   <xs:element ref="xs:attribute"/>
+   <xs:element ref="xs:notation"/>
+  </xs:choice>
+ </xs:group>
+ <xs:group name="redefinable">
+  <xs:annotation>
+   <xs:documentation>
+   This group is for the
+   elements which can self-redefine (see &lt;redefine> below).</xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:element ref="xs:simpleType"/>
+   <xs:element ref="xs:complexType"/>
+   <xs:element ref="xs:group"/>
+   <xs:element ref="xs:attributeGroup"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:simpleType name="formChoice">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:NMTOKEN">
+   <xs:enumeration value="qualified"/>
+   <xs:enumeration value="unqualified"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="reducedDerivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:derivationControl">
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="derivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {extension, restriction}</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>    
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list itemType="xs:reducedDerivationControl"/>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:simpleType name="typeDerivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:derivationControl">
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+   <xs:enumeration value="list"/>
+   <xs:enumeration value="union"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+  <xs:simpleType name="fullDerivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {extension, restriction, list, union}</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>    
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list itemType="xs:typeDerivationControl"/>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:element name="schema" id="schema">
+  <xs:annotation>
+    <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-schema"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:openAttrs">
+     <xs:sequence>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:element ref="xs:include"/>
+       <xs:element ref="xs:import"/>
+       <xs:element ref="xs:redefine"/>
+       <xs:element ref="xs:annotation"/>
+      </xs:choice>
+      <xs:sequence minOccurs="0" maxOccurs="unbounded">
+       <xs:group ref="xs:schemaTop"/>
+       <xs:element ref="xs:annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+     </xs:sequence>
+     <xs:attribute name="targetNamespace" type="xs:anyURI"/>
+     <xs:attribute name="version" type="xs:token"/>
+     <xs:attribute name="finalDefault" type="xs:fullDerivationSet" use="optional" default=""/>
+     <xs:attribute name="blockDefault" type="xs:blockSet" use="optional" default=""/>
+     <xs:attribute name="attributeFormDefault" type="xs:formChoice" use="optional" default="unqualified"/>
+     <xs:attribute name="elementFormDefault" type="xs:formChoice" use="optional" default="unqualified"/>
+     <xs:attribute name="id" type="xs:ID"/>
+     <xs:attribute ref="xml:lang"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+
+  <xs:key name="element">
+   <xs:selector xpath="xs:element"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="attribute">
+   <xs:selector xpath="xs:attribute"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="type">
+   <xs:selector xpath="xs:complexType|xs:simpleType"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+  <xs:key name="group">
+   <xs:selector xpath="xs:group"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+  <xs:key name="attributeGroup">
+   <xs:selector xpath="xs:attributeGroup"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+  <xs:key name="notation">
+   <xs:selector xpath="xs:notation"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="identityConstraint">
+   <xs:selector xpath=".//xs:key|.//xs:unique|.//xs:keyref"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+ </xs:element>
+
+ <xs:simpleType name="allNNI">
+  <xs:annotation><xs:documentation>
+   for maxOccurs</xs:documentation></xs:annotation>
+  <xs:union memberTypes="xs:nonNegativeInteger">
+   <xs:simpleType>
+    <xs:restriction base="xs:NMTOKEN">
+     <xs:enumeration value="unbounded"/>
+    </xs:restriction>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:attributeGroup name="occurs">
+  <xs:annotation><xs:documentation>
+   for all particles</xs:documentation></xs:annotation>
+  <xs:attribute name="minOccurs" type="xs:nonNegativeInteger" use="optional" default="1"/>
+  <xs:attribute name="maxOccurs" type="xs:allNNI" use="optional" default="1"/>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="defRef">
+  <xs:annotation><xs:documentation>
+   for element, group and attributeGroup,
+   which both define and reference</xs:documentation></xs:annotation>
+  <xs:attribute name="name" type="xs:NCName"/>
+  <xs:attribute name="ref" type="xs:QName"/>
+ </xs:attributeGroup>
+
+ <xs:group name="typeDefParticle">
+  <xs:annotation>
+    <xs:documentation>
+   'complexType' uses this</xs:documentation></xs:annotation>
+  <xs:choice>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:all"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:group name="nestedParticle">
+  <xs:choice>
+   <xs:element name="element" type="xs:localElement"/>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+   <xs:element ref="xs:any"/>
+  </xs:choice>
+ </xs:group>
+ <xs:group name="particle">
+  <xs:choice>
+   <xs:element name="element" type="xs:localElement"/>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:all"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+   <xs:element ref="xs:any"/>
+  </xs:choice>
+ </xs:group>
+ <xs:complexType name="attribute">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
+    </xs:sequence>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attribute name="type" type="xs:QName"/>
+    <xs:attribute name="use" use="optional" default="optional">
+     <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+       <xs:enumeration value="prohibited"/>
+       <xs:enumeration value="optional"/>
+       <xs:enumeration value="required"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="default" type="xs:string"/>
+    <xs:attribute name="fixed" type="xs:string"/>
+    <xs:attribute name="form" type="xs:formChoice"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="topLevelAttribute">
+  <xs:complexContent>
+   <xs:restriction base="xs:attribute">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="form" use="prohibited"/>
+    <xs:attribute name="use" use="prohibited"/>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="attrDecls">
+  <xs:sequence>
+   <xs:choice minOccurs="0" maxOccurs="unbounded">
+    <xs:element name="attribute" type="xs:attribute"/>
+    <xs:element name="attributeGroup" type="xs:attributeGroupRef"/>
+   </xs:choice>
+   <xs:element ref="xs:anyAttribute" minOccurs="0"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:element name="anyAttribute" type="xs:wildcard" id="anyAttribute">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-anyAttribute"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:group name="complexTypeModel">
+  <xs:choice>
+      <xs:element ref="xs:simpleContent"/>
+      <xs:element ref="xs:complexContent"/>
+      <xs:sequence>
+       <xs:annotation>
+        <xs:documentation>
+   This branch is short for
+   &lt;complexContent>
+   &lt;restriction base="xs:anyType">
+   ...
+   &lt;/restriction>
+   &lt;/complexContent></xs:documentation>
+       </xs:annotation>
+       <xs:group ref="xs:typeDefParticle" minOccurs="0"/>
+       <xs:group ref="xs:attrDecls"/>
+      </xs:sequence>
+  </xs:choice>
+ </xs:group>
+
+ <xs:complexType name="complexType" abstract="true">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:complexTypeModel"/>
+    <xs:attribute name="name" type="xs:NCName">
+     <xs:annotation>
+      <xs:documentation>
+      Will be restricted to required or forbidden</xs:documentation>
+     </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="mixed" type="xs:boolean" use="optional" default="false">
+     <xs:annotation>
+      <xs:documentation>
+      Not allowed if simpleContent child is chosen.
+      May be overriden by setting on complexContent child.</xs:documentation>
+    </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="abstract" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="final" type="xs:derivationSet"/>
+    <xs:attribute name="block" type="xs:derivationSet"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="topLevelComplexType">
+  <xs:complexContent>
+   <xs:restriction base="xs:complexType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:complexTypeModel"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="required"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="localComplexType">
+  <xs:complexContent>
+   <xs:restriction base="xs:complexType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:complexTypeModel"/>
+    </xs:sequence>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:attribute name="abstract" use="prohibited"/>
+    <xs:attribute name="final" use="prohibited"/>
+    <xs:attribute name="block" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="restrictionType">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:choice minOccurs="0">
+      <xs:group ref="xs:typeDefParticle"/>
+      <xs:group ref="xs:simpleRestrictionModel"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="base" type="xs:QName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:complexType name="complexRestrictionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:restrictionType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:annotation>
+       <xs:documentation>This choice is added simply to
+                   make this a valid restriction per the REC</xs:documentation>
+      </xs:annotation>
+      <xs:group ref="xs:typeDefParticle"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:complexType name="extensionType">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:group ref="xs:typeDefParticle" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="base" type="xs:QName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:element name="complexContent" id="complexContent">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-complexContent"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:choice>
+      <xs:element name="restriction" type="xs:complexRestrictionType"/>
+      <xs:element name="extension" type="xs:extensionType"/>
+     </xs:choice>     
+     <xs:attribute name="mixed" type="xs:boolean">
+      <xs:annotation>
+       <xs:documentation>
+       Overrides any setting on complexType parent.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="simpleRestrictionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:restrictionType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:annotation>
+       <xs:documentation>This choice is added simply to
+                   make this a valid restriction per the REC</xs:documentation>
+      </xs:annotation>
+      <xs:group ref="xs:simpleRestrictionModel"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="simpleExtensionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:extensionType">
+    <xs:sequence>
+     <xs:annotation>
+      <xs:documentation>
+      No typeDefParticle group reference</xs:documentation>
+     </xs:annotation>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="simpleContent" id="simpleContent">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-simpleContent"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:choice>
+      <xs:element name="restriction" type="xs:simpleRestrictionType"/>
+      <xs:element name="extension" type="xs:simpleExtensionType"/>
+     </xs:choice>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+ <xs:element name="complexType" type="xs:topLevelComplexType" id="complexType">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-complexType"/>
+  </xs:annotation>
+ </xs:element>
+
+
+  <xs:simpleType name="blockSet">
+   <xs:annotation>
+    <xs:documentation>
+    A utility type, not for public use</xs:documentation>
+    <xs:documentation>
+    #all or (possibly empty) subset of {substitution, extension,
+    restriction}</xs:documentation>
+   </xs:annotation>
+   <xs:union>
+    <xs:simpleType>    
+     <xs:restriction base="xs:token">
+      <xs:enumeration value="#all"/>
+     </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType>
+     <xs:list>
+      <xs:simpleType>
+       <xs:restriction base="xs:derivationControl">
+        <xs:enumeration value="extension"/>
+        <xs:enumeration value="restriction"/>
+        <xs:enumeration value="substitution"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:list>
+    </xs:simpleType>
+   </xs:union>  
+  </xs:simpleType>
+
+ <xs:complexType name="element" abstract="true">
+  <xs:annotation>
+   <xs:documentation>
+   The element element can be used either
+   at the top level to define an element-type binding globally,
+   or within a content model to either reference a globally-defined
+   element or type or declare an element-type binding locally.
+   The ref form is not allowed at the top level.</xs:documentation>
+  </xs:annotation>
+
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attribute name="type" type="xs:QName"/>
+    <xs:attribute name="substitutionGroup" type="xs:QName"/>
+    <xs:attributeGroup ref="xs:occurs"/>
+    <xs:attribute name="default" type="xs:string"/>
+    <xs:attribute name="fixed" type="xs:string"/>
+    <xs:attribute name="nillable" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="abstract" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="final" type="xs:derivationSet"/>
+    <xs:attribute name="block" type="xs:blockSet"/>
+    <xs:attribute name="form" type="xs:formChoice"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="topLevelElement">
+  <xs:complexContent>
+   <xs:restriction base="xs:element">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="form" use="prohibited"/>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="localElement">
+  <xs:complexContent>
+   <xs:restriction base="xs:element">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="substitutionGroup" use="prohibited"/>
+    <xs:attribute name="final" use="prohibited"/>
+    <xs:attribute name="abstract" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="element" type="xs:topLevelElement" id="element">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-element"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="group" abstract="true">
+  <xs:annotation>
+   <xs:documentation>
+   group type for explicit groups, named top-level groups and
+   group references</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:particle" minOccurs="0" maxOccurs="unbounded"/>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attributeGroup ref="xs:occurs"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="realGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:group">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0" maxOccurs="1">
+      <xs:element ref="xs:all"/>
+      <xs:element ref="xs:choice"/>
+      <xs:element ref="xs:sequence"/>
+     </xs:choice>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="namedGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:realGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="1" maxOccurs="1">
+      <xs:element name="all">
+       <xs:complexType>
+        <xs:complexContent>
+         <xs:restriction base="xs:all">
+          <xs:group ref="xs:allModel"/>
+          <xs:attribute name="minOccurs" use="prohibited"/>
+          <xs:attribute name="maxOccurs" use="prohibited"/>
+          <xs:anyAttribute namespace="##other" processContents="lax"/>
+         </xs:restriction>
+        </xs:complexContent>
+       </xs:complexType>
+      </xs:element>
+      <xs:element name="choice" type="xs:simpleExplicitGroup"/>
+      <xs:element name="sequence" type="xs:simpleExplicitGroup"/>
+     </xs:choice>
+    </xs:sequence>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="groupRef">
+  <xs:complexContent>
+   <xs:restriction base="xs:realGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="required" type="xs:QName"/>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="explicitGroup">
+  <xs:annotation>
+   <xs:documentation>
+   group type for the three kinds of group</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:restriction base="xs:group">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:nestedParticle" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="prohibited"/>
+    <xs:attribute name="ref" type="xs:QName" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="simpleExplicitGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:explicitGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:nestedParticle" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:group name="allModel">
+  <xs:sequence>
+      <xs:element ref="xs:annotation" minOccurs="0"/>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:annotation>
+        <xs:documentation>This choice with min/max is here to
+                          avoid a pblm with the Elt:All/Choice/Seq
+                          Particle derivation constraint</xs:documentation>
+       </xs:annotation>
+       <xs:element name="element" type="xs:narrowMaxMin"/>
+      </xs:choice>
+     </xs:sequence>
+ </xs:group>
+ <xs:complexType name="narrowMaxMin">
+  <xs:annotation>
+   <xs:documentation>restricted max/min</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:restriction base="xs:localElement">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="minOccurs" use="optional" default="1">
+     <xs:simpleType>
+      <xs:restriction base="xs:nonNegativeInteger">
+       <xs:enumeration value="0"/>
+       <xs:enumeration value="1"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="maxOccurs" use="optional" default="1">
+     <xs:simpleType>
+      <xs:restriction base="xs:allNNI">
+       <xs:enumeration value="0"/>
+       <xs:enumeration value="1"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+  <xs:complexType name="all">
+   <xs:annotation>
+    <xs:documentation>
+   Only elements allowed inside</xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+    <xs:restriction base="xs:explicitGroup">
+     <xs:group ref="xs:allModel"/>
+     <xs:attribute name="minOccurs" use="optional" default="1">
+      <xs:simpleType>
+       <xs:restriction base="xs:nonNegativeInteger">
+        <xs:enumeration value="0"/>
+        <xs:enumeration value="1"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+     <xs:attribute name="maxOccurs" use="optional" default="1">
+      <xs:simpleType>
+       <xs:restriction base="xs:allNNI">
+        <xs:enumeration value="1"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+     <xs:anyAttribute namespace="##other" processContents="lax"/>
+    </xs:restriction>
+   </xs:complexContent>
+  </xs:complexType>
+
+ <xs:element name="all" id="all" type="xs:all">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-all"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="choice" type="xs:explicitGroup" id="choice">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-choice"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="sequence" type="xs:explicitGroup" id="sequence">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-sequence"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="group" type="xs:namedGroup" id="group">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-group"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="wildcard">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:attribute name="namespace" type="xs:namespaceList" use="optional" default="##any"/>
+    <xs:attribute name="processContents" use="optional" default="strict">
+     <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+       <xs:enumeration value="skip"/>
+       <xs:enumeration value="lax"/>
+       <xs:enumeration value="strict"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="any" id="any">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-any"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:wildcard">
+     <xs:attributeGroup ref="xs:occurs"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+  <xs:annotation>
+   <xs:documentation>
+   simple type for the value of the 'namespace' attr of
+   'any' and 'anyAttribute'</xs:documentation>
+  </xs:annotation>
+  <xs:annotation>
+   <xs:documentation>
+   Value is
+              ##any      - - any non-conflicting WFXML/attribute at all
+
+              ##other    - - any non-conflicting WFXML/attribute from
+                              namespace other than targetNS
+
+              ##local    - - any unqualified non-conflicting WFXML/attribute 
+
+              one or     - - any non-conflicting WFXML/attribute from
+              more URI        the listed namespaces
+              references
+              (space separated)
+
+    ##targetNamespace or ##local may appear in the above list, to
+        refer to the targetNamespace of the enclosing
+        schema or an absent targetNamespace respectively</xs:documentation>
+  </xs:annotation>
+
+ <xs:simpleType name="namespaceList">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="##any"/>
+     <xs:enumeration value="##other"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list>
+     <xs:simpleType>
+      <xs:union memberTypes="xs:anyURI">
+       <xs:simpleType>
+        <xs:restriction base="xs:token">
+         <xs:enumeration value="##targetNamespace"/>
+         <xs:enumeration value="##local"/>
+        </xs:restriction>
+       </xs:simpleType>
+      </xs:union>
+     </xs:simpleType>
+    </xs:list>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:element name="attribute" type="xs:topLevelAttribute" id="attribute">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-attribute"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="attributeGroup" abstract="true">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:attrDecls"/>
+    <xs:attributeGroup ref="xs:defRef"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="namedAttributeGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:attributeGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="attributeGroupRef">
+  <xs:complexContent>
+   <xs:restriction base="xs:attributeGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="required" type="xs:QName"/>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="attributeGroup" type="xs:namedAttributeGroup" id="attributeGroup">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-attributeGroup"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="include" id="include">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-include"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="schemaLocation" type="xs:anyURI" use="required"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="redefine" id="redefine">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-redefine"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:openAttrs">
+     <xs:choice minOccurs="0" maxOccurs="unbounded">
+      <xs:element ref="xs:annotation"/>
+      <xs:group ref="xs:redefinable"/>
+     </xs:choice>
+     <xs:attribute name="schemaLocation" type="xs:anyURI" use="required"/>
+     <xs:attribute name="id" type="xs:ID"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="import" id="import">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-import"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="namespace" type="xs:anyURI"/>
+     <xs:attribute name="schemaLocation" type="xs:anyURI"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="selector" id="selector">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-selector"/>
+  </xs:annotation>
+  <xs:complexType>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+     <xs:attribute name="xpath" use="required">
+      <xs:simpleType>
+       <xs:annotation>
+        <xs:documentation>A subset of XPath expressions for use
+in selectors</xs:documentation>
+        <xs:documentation>A utility type, not for public
+use</xs:documentation>
+       </xs:annotation>
+       <xs:restriction base="xs:token">
+        <xs:annotation>
+         <xs:documentation>The following pattern is intended to allow XPath
+                           expressions per the following EBNF:
+          Selector    ::=    Path ( '|' Path )*  
+          Path    ::=    ('.//')? Step ( '/' Step )*  
+          Step    ::=    '.' | NameTest  
+          NameTest    ::=    QName | '*' | NCName ':' '*'  
+                           child:: is also allowed
+         </xs:documentation>
+        </xs:annotation>
+        <xs:pattern value="(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*(\|(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*)*">
+        </xs:pattern>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="field" id="field">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-field"/>
+  </xs:annotation>
+  <xs:complexType>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+     <xs:attribute name="xpath" use="required">
+      <xs:simpleType>
+       <xs:annotation>
+        <xs:documentation>A subset of XPath expressions for use
+in fields</xs:documentation>
+        <xs:documentation>A utility type, not for public
+use</xs:documentation>
+       </xs:annotation>
+       <xs:restriction base="xs:token">
+        <xs:annotation>
+         <xs:documentation>The following pattern is intended to allow XPath
+                           expressions per the same EBNF as for selector,
+                           with the following change:
+          Path    ::=    ('.//')? ( Step '/' )* ( Step | '@' NameTest ) 
+         </xs:documentation>
+        </xs:annotation>
+        <xs:pattern value="(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*))))(\|(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*)))))*">
+        </xs:pattern>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="keybase">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:element ref="xs:selector"/>
+     <xs:element ref="xs:field" minOccurs="1" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="identityConstraint">
+  <xs:annotation>
+   <xs:documentation>The three kinds of identity constraints, all with
+                     type of or derived from 'keybase'.
+   </xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:element ref="xs:unique"/>
+   <xs:element ref="xs:key"/>
+   <xs:element ref="xs:keyref"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:element name="unique" type="xs:keybase" id="unique">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-unique"/>
+  </xs:annotation>
+ </xs:element>
+ <xs:element name="key" type="xs:keybase" id="key">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-key"/>
+  </xs:annotation>
+ </xs:element>
+ <xs:element name="keyref" id="keyref">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-keyref"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:keybase">
+     <xs:attribute name="refer" type="xs:QName" use="required"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="notation" id="notation">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-notation"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="name" type="xs:NCName" use="required"/>
+     <xs:attribute name="public" type="xs:public"/>
+     <xs:attribute name="system" type="xs:anyURI"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="public">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   A public identifier, per ISO 8879</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:token"/>
+ </xs:simpleType>
+
+ <xs:element name="appinfo" id="appinfo">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-appinfo"/>
+   </xs:annotation>
+   <xs:complexType mixed="true">
+    <xs:sequence minOccurs="0" maxOccurs="unbounded">
+     <xs:any processContents="lax"/>
+    </xs:sequence>
+    <xs:attribute name="source" type="xs:anyURI"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="documentation" id="documentation">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-documentation"/>
+   </xs:annotation>
+   <xs:complexType mixed="true">
+    <xs:sequence minOccurs="0" maxOccurs="unbounded">
+     <xs:any processContents="lax"/>
+    </xs:sequence>
+    <xs:attribute name="source" type="xs:anyURI"/>
+    <xs:attribute ref="xml:lang"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="annotation" id="annotation">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-annotation"/>
+   </xs:annotation>
+   <xs:complexType>
+    <xs:complexContent>
+     <xs:extension base="xs:openAttrs">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:element ref="xs:appinfo"/>
+       <xs:element ref="xs:documentation"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:ID"/>
+     </xs:extension>
+    </xs:complexContent>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:annotation>
+  <xs:documentation>
+   notations for use within XML Schema schemas</xs:documentation>
+ </xs:annotation>
+
+ <xs:notation name="XMLSchemaStructures" public="structures" system="http://www.w3.org/2000/08/XMLSchema.xsd"/>
+ <xs:notation name="XML" public="REC-xml-19980210" system="http://www.w3.org/TR/1998/REC-xml-19980210"/>
+  
+ <xs:complexType name="anyType" mixed="true">
+  <xs:annotation>
+   <xs:documentation>
+   Not the real urType, but as close an approximation as we can
+   get in the XML representation</xs:documentation>
+  </xs:annotation>
+  <xs:sequence>
+   <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+  </xs:sequence>
+  <xs:anyAttribute processContents="lax"/>
+ </xs:complexType>
+
+  <xs:annotation>
+    <xs:documentation>
+      First the built-in primitive datatypes.  These definitions are for
+      information only, the real built-in definitions are magic.
+    </xs:documentation>
+
+    <xs:documentation>
+      For each built-in datatype in this schema (both primitive and
+      derived) can be uniquely addressed via a URI constructed
+      as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the datatype
+
+      For example, to address the int datatype, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#int
+
+      Additionally, each facet definition element can be uniquely
+      addressed via a URI constructed as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the facet
+
+      For example, to address the maxInclusive facet, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#maxInclusive
+
+      Additionally, each facet usage in a built-in datatype definition
+      can be uniquely addressed via a URI constructed as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the datatype, followed
+           by a period (".") followed by the name of the facet
+
+      For example, to address the usage of the maxInclusive facet in
+      the definition of int, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#int.maxInclusive
+
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:simpleType name="string" id="string">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#string"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="preserve" id="string.preserve"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="boolean" id="boolean">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#boolean"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="boolean.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="float" id="float">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#float"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="float.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="double" id="double">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#double"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="double.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="decimal" id="decimal">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="totalDigits"/>
+        <hfp:hasFacet name="fractionDigits"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#decimal"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="decimal.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+   <xs:simpleType name="duration" id="duration">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#duration"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="duration.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+ <xs:simpleType name="dateTime" id="dateTime">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#dateTime"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="dateTime.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="time" id="time">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#time"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="time.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="date" id="date">
+   <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#date"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="date.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gYearMonth" id="gYearMonth">
+   <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gYearMonth"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="gYearMonth.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gYear" id="gYear">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gYear"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="gYear.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="gMonthDay" id="gMonthDay">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+       <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gMonthDay"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse" fixed="true"
+                id="gMonthDay.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gDay" id="gDay">
+    <xs:annotation>
+  <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gDay"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse"  fixed="true"
+                id="gDay.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="gMonth" id="gMonth">
+    <xs:annotation>
+  <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gMonth"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse"  fixed="true"
+                id="gMonth.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="hexBinary" id="hexBinary">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#binary"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="hexBinary.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+ <xs:simpleType name="base64Binary" id="base64Binary">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#base64Binary"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="base64Binary.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+   <xs:simpleType name="anyURI" id="anyURI">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#anyURI"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="anyURI.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+  <xs:simpleType name="QName" id="QName">
+    <xs:annotation>
+        <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#QName"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="QName.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="NOTATION" id="NOTATION">
+    <xs:annotation>
+        <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NOTATION"/>
+      <xs:documentation>
+        NOTATION cannot be used directly in a schema; rather a type
+        must be derived from it by specifying at least one enumeration
+        facet whose value is the name of a NOTATION declared in the
+        schema.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="NOTATION.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:annotation>
+    <xs:documentation>
+      Now the derived primitive types
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:simpleType name="normalizedString" id="normalizedString">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#normalizedString"/>
+    </xs:annotation>
+    <xs:restriction base="xs:string">
+      <xs:whiteSpace value="replace"
+        id="normalizedString.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="token" id="token">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#token"/>
+    </xs:annotation>
+    <xs:restriction base="xs:normalizedString">
+      <xs:whiteSpace value="collapse" id="token.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="language" id="language">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#language"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern
+        value="[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*"
+                id="language.pattern">
+        <xs:annotation>
+          <xs:documentation
+                source="http://www.ietf.org/rfc/rfc3066.txt">
+            pattern specifies the content of section 2.12 of XML 1.0e2
+            and RFC 3066 (Revised version of RFC 1766).
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="IDREFS" id="IDREFS">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#IDREFS"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:IDREF"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="IDREFS.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="ENTITIES" id="ENTITIES">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#ENTITIES"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:ENTITY"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="ENTITIES.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NMTOKEN" id="NMTOKEN">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NMTOKEN"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern value="\c+" id="NMTOKEN.pattern">
+        <xs:annotation>
+          <xs:documentation
+                source="http://www.w3.org/TR/REC-xml#NT-Nmtoken">
+            pattern matches production 7 from the XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NMTOKENS" id="NMTOKENS">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NMTOKENS"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:NMTOKEN"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="NMTOKENS.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="Name" id="Name">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#Name"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern value="\i\c*" id="Name.pattern">
+        <xs:annotation>
+          <xs:documentation
+                        source="http://www.w3.org/TR/REC-xml#NT-Name">
+            pattern matches production 5 from the XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NCName" id="NCName">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NCName"/>
+    </xs:annotation>
+    <xs:restriction base="xs:Name">
+      <xs:pattern value="[\i-[:]][\c-[:]]*" id="NCName.pattern">
+        <xs:annotation>
+          <xs:documentation
+                source="http://www.w3.org/TR/REC-xml-names/#NT-NCName">
+            pattern matches production 4 from the Namespaces in XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="ID" id="ID">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#ID"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+   <xs:simpleType name="IDREF" id="IDREF">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#IDREF"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+   <xs:simpleType name="ENTITY" id="ENTITY">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#ENTITY"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+  <xs:simpleType name="integer" id="integer">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#integer"/>
+    </xs:annotation>
+    <xs:restriction base="xs:decimal">
+      <xs:fractionDigits value="0" fixed="true" id="integer.fractionDigits"/>
+      <xs:pattern value="[\-+]?[0-9]+"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="nonPositiveInteger" id="nonPositiveInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#nonPositiveInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:maxInclusive value="0" id="nonPositiveInteger.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="negativeInteger" id="negativeInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#negativeInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonPositiveInteger">
+      <xs:maxInclusive value="-1" id="negativeInteger.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="long" id="long">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#long"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="-9223372036854775808" id="long.minInclusive"/>
+      <xs:maxInclusive value="9223372036854775807" id="long.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="int" id="int">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#int"/>
+    </xs:annotation>
+    <xs:restriction base="xs:long">
+      <xs:minInclusive value="-2147483648" id="int.minInclusive"/>
+      <xs:maxInclusive value="2147483647" id="int.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="short" id="short">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#short"/>
+    </xs:annotation>
+    <xs:restriction base="xs:int">
+      <xs:minInclusive value="-32768" id="short.minInclusive"/>
+      <xs:maxInclusive value="32767" id="short.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="byte" id="byte">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#byte"/>
+    </xs:annotation>
+    <xs:restriction base="xs:short">
+      <xs:minInclusive value="-128" id="byte.minInclusive"/>
+      <xs:maxInclusive value="127" id="byte.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="nonNegativeInteger" id="nonNegativeInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#nonNegativeInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="0" id="nonNegativeInteger.minInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedLong" id="unsignedLong">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedLong"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonNegativeInteger">
+      <xs:maxInclusive value="18446744073709551615"
+        id="unsignedLong.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedInt" id="unsignedInt">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedInt"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedLong">
+      <xs:maxInclusive value="4294967295"
+        id="unsignedInt.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedShort" id="unsignedShort">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedShort"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedInt">
+      <xs:maxInclusive value="65535"
+        id="unsignedShort.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedByte" id="unsignedByte">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedByte"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedShort">
+      <xs:maxInclusive value="255" id="unsignedByte.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="positiveInteger" id="positiveInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#positiveInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonNegativeInteger">
+      <xs:minInclusive value="1" id="positiveInteger.minInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="derivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:NMTOKEN">
+   <xs:enumeration value="substitution"/>
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+   <xs:enumeration value="list"/>
+   <xs:enumeration value="union"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:group name="simpleDerivation">
+  <xs:choice>
+    <xs:element ref="xs:restriction"/>
+    <xs:element ref="xs:list"/>
+    <xs:element ref="xs:union"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:simpleType name="simpleDerivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {restriction, union, list}
+   </xs:documentation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list>
+     <xs:simpleType>
+      <xs:restriction base="xs:derivationControl">
+       <xs:enumeration value="list"/>
+       <xs:enumeration value="union"/>
+       <xs:enumeration value="restriction"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:list>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+  <xs:complexType name="simpleType" abstract="true">
+    <xs:complexContent>
+      <xs:extension base="xs:annotated">
+        <xs:group ref="xs:simpleDerivation"/>
+        <xs:attribute name="final" type="xs:simpleDerivationSet"/>
+        <xs:attribute name="name" type="xs:NCName">
+          <xs:annotation>
+            <xs:documentation>
+              Can be restricted to required or forbidden
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="topLevelSimpleType">
+    <xs:complexContent>
+      <xs:restriction base="xs:simpleType">
+        <xs:sequence>
+          <xs:element ref="xs:annotation" minOccurs="0"/>
+          <xs:group ref="xs:simpleDerivation"/>
+        </xs:sequence>
+        <xs:attribute name="name" use="required"
+             type="xs:NCName">
+          <xs:annotation>
+            <xs:documentation>
+              Required at the top level
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="localSimpleType">
+    <xs:complexContent>
+      <xs:restriction base="xs:simpleType">
+        <xs:sequence>
+          <xs:element ref="xs:annotation" minOccurs="0"/>
+          <xs:group ref="xs:simpleDerivation"/>
+        </xs:sequence>
+        <xs:attribute name="name" use="prohibited">
+          <xs:annotation>
+            <xs:documentation>
+              Forbidden when nested
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="final" use="prohibited"/>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="simpleType" type="xs:topLevelSimpleType" id="simpleType">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-simpleType"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:group name="facets">
+   <xs:annotation>
+    <xs:documentation>
+       We should use a substitution group for facets, but
+       that's ruled out because it would allow users to
+       add their own, which we're not ready for yet.
+    </xs:documentation>
+   </xs:annotation>
+   <xs:choice>
+    <xs:element ref="xs:minExclusive"/>
+    <xs:element ref="xs:minInclusive"/>
+    <xs:element ref="xs:maxExclusive"/>
+    <xs:element ref="xs:maxInclusive"/>
+    <xs:element ref="xs:totalDigits"/>
+    <xs:element ref="xs:fractionDigits"/>
+    <xs:element ref="xs:length"/>
+    <xs:element ref="xs:minLength"/>
+    <xs:element ref="xs:maxLength"/>
+    <xs:element ref="xs:enumeration"/>
+    <xs:element ref="xs:whiteSpace"/>
+    <xs:element ref="xs:pattern"/>
+   </xs:choice>
+  </xs:group>
+
+  <xs:group name="simpleRestrictionModel">
+   <xs:sequence>
+    <xs:element name="simpleType" type="xs:localSimpleType" minOccurs="0"/>
+    <xs:group ref="xs:facets" minOccurs="0" maxOccurs="unbounded"/>
+   </xs:sequence>
+  </xs:group>
+
+  <xs:element name="restriction" id="restriction">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#element-restriction">
+          base attribute and simpleType child are mutually
+          exclusive, but one or other is required
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+         <xs:group ref="xs:simpleRestrictionModel"/>
+         <xs:attribute name="base" type="xs:QName" use="optional"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="list" id="list">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#element-list">
+          itemType attribute and simpleType child are mutually
+          exclusive, but one or other is required
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+          <xs:sequence>
+            <xs:element name="simpleType" type="xs:localSimpleType"
+                minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="itemType" type="xs:QName" use="optional"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="union" id="union">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#element-union">
+          memberTypes attribute must be non-empty or there must be
+          at least one simpleType child
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+          <xs:sequence>
+            <xs:element name="simpleType" type="xs:localSimpleType"
+                minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="memberTypes" use="optional">
+            <xs:simpleType>
+              <xs:list itemType="xs:QName"/>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:complexType name="facet">
+    <xs:complexContent>
+      <xs:extension base="xs:annotated">
+        <xs:attribute name="value" use="required"/>
+        <xs:attribute name="fixed" type="xs:boolean" use="optional"
+                      default="false"/>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+ <xs:complexType name="noFixedFacet">
+  <xs:complexContent>
+   <xs:restriction base="xs:facet">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="fixed" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+  <xs:element name="minExclusive" id="minExclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-minExclusive"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="minInclusive" id="minInclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-minInclusive"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="maxExclusive" id="maxExclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-maxExclusive"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="maxInclusive" id="maxInclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-maxInclusive"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:complexType name="numFacet">
+    <xs:complexContent>
+      <xs:restriction base="xs:facet">
+       <xs:sequence>
+         <xs:element ref="xs:annotation" minOccurs="0"/>
+       </xs:sequence>
+       <xs:attribute name="value" type="xs:nonNegativeInteger" use="required"/>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="totalDigits" id="totalDigits">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-totalDigits"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:numFacet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" type="xs:positiveInteger" use="required"/>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="fractionDigits" id="fractionDigits" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-fractionDigits"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="length" id="length" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-length"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="minLength" id="minLength" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-minLength"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="maxLength" id="maxLength" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-maxLength"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="enumeration" id="enumeration" type="xs:noFixedFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-enumeration"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="whiteSpace" id="whiteSpace">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-whiteSpace"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:facet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" use="required">
+            <xs:simpleType>
+              <xs:restriction base="xs:NMTOKEN">
+                <xs:enumeration value="preserve"/>
+                <xs:enumeration value="replace"/>
+                <xs:enumeration value="collapse"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="pattern" id="pattern">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-pattern"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:noFixedFacet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" type="xs:string" use="required"/>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+</xs:schema>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/datatypes.dtd b/org.argeo.app.core/src/org/argeo/app/core/schemas/datatypes.dtd
new file mode 100644 (file)
index 0000000..8e48553
--- /dev/null
@@ -0,0 +1,203 @@
+<!--
+        DTD for XML Schemas: Part 2: Datatypes
+        $Id: datatypes.dtd,v 1.23 2001/03/16 17:36:30 ht Exp $
+        Note this DTD is NOT normative, or even definitive. - - the
+        prose copy in the datatypes REC is the definitive version
+        (which shouldn't differ from this one except for this comment
+        and entity expansions, but just in case)
+  -->
+
+<!--
+        This DTD cannot be used on its own, it is intended
+        only for incorporation in XMLSchema.dtd, q.v.
+  -->
+
+<!-- Define all the element names, with optional prefix -->
+<!ENTITY % simpleType "%p;simpleType">
+<!ENTITY % restriction "%p;restriction">
+<!ENTITY % list "%p;list">
+<!ENTITY % union "%p;union">
+<!ENTITY % maxExclusive "%p;maxExclusive">
+<!ENTITY % minExclusive "%p;minExclusive">
+<!ENTITY % maxInclusive "%p;maxInclusive">
+<!ENTITY % minInclusive "%p;minInclusive">
+<!ENTITY % totalDigits "%p;totalDigits">
+<!ENTITY % fractionDigits "%p;fractionDigits">
+<!ENTITY % length "%p;length">
+<!ENTITY % minLength "%p;minLength">
+<!ENTITY % maxLength "%p;maxLength">
+<!ENTITY % enumeration "%p;enumeration">
+<!ENTITY % whiteSpace "%p;whiteSpace">
+<!ENTITY % pattern "%p;pattern">
+
+<!--
+        Customisation entities for the ATTLIST of each element
+        type. Define one of these if your schema takes advantage
+        of the anyAttribute='##other' in the schema for schemas
+  -->
+
+<!ENTITY % simpleTypeAttrs "">
+<!ENTITY % restrictionAttrs "">
+<!ENTITY % listAttrs "">
+<!ENTITY % unionAttrs "">
+<!ENTITY % maxExclusiveAttrs "">
+<!ENTITY % minExclusiveAttrs "">
+<!ENTITY % maxInclusiveAttrs "">
+<!ENTITY % minInclusiveAttrs "">
+<!ENTITY % totalDigitsAttrs "">
+<!ENTITY % fractionDigitsAttrs "">
+<!ENTITY % lengthAttrs "">
+<!ENTITY % minLengthAttrs "">
+<!ENTITY % maxLengthAttrs "">
+<!ENTITY % enumerationAttrs "">
+<!ENTITY % whiteSpaceAttrs "">
+<!ENTITY % patternAttrs "">
+
+<!-- Define some entities for informative use as attribute
+        types -->
+<!ENTITY % URIref "CDATA">
+<!ENTITY % XPathExpr "CDATA">
+<!ENTITY % QName "NMTOKEN">
+<!ENTITY % QNames "NMTOKENS">
+<!ENTITY % NCName "NMTOKEN">
+<!ENTITY % nonNegativeInteger "NMTOKEN">
+<!ENTITY % boolean "(true|false)">
+<!ENTITY % simpleDerivationSet "CDATA">
+<!--
+        #all or space-separated list drawn from derivationChoice
+  -->
+
+<!--
+        Note that the use of 'facet' below is less restrictive
+        than is really intended:  There should in fact be no
+        more than one of each of minInclusive, minExclusive,
+        maxInclusive, maxExclusive, totalDigits, fractionDigits,
+        length, maxLength, minLength within datatype,
+        and the min- and max- variants of Inclusive and Exclusive
+        are mutually exclusive. On the other hand,  pattern and
+        enumeration may repeat.
+  -->
+<!ENTITY % minBound "(%minInclusive; | %minExclusive;)">
+<!ENTITY % maxBound "(%maxInclusive; | %maxExclusive;)">
+<!ENTITY % bounds "%minBound; | %maxBound;">
+<!ENTITY % numeric "%totalDigits; | %fractionDigits;">
+<!ENTITY % ordered "%bounds; | %numeric;">
+<!ENTITY % unordered
+   "%pattern; | %enumeration; | %whiteSpace; | %length; |
+   %maxLength; | %minLength;">
+<!ENTITY % facet "%ordered; | %unordered;">
+<!ENTITY % facetAttr 
+        "value CDATA #REQUIRED
+        id ID #IMPLIED">
+<!ENTITY % fixedAttr "fixed %boolean; #IMPLIED">
+<!ENTITY % facetModel "(%annotation;)?">
+<!ELEMENT %simpleType;
+        ((%annotation;)?, (%restriction; | %list; | %union;))>
+<!ATTLIST %simpleType;
+    name      %NCName; #IMPLIED
+    final     %simpleDerivationSet; #IMPLIED
+    id        ID       #IMPLIED
+    %simpleTypeAttrs;>
+<!-- name is required at top level -->
+<!ELEMENT %restriction; ((%annotation;)?,
+                         (%restriction1; |
+                          ((%simpleType;)?,(%facet;)*)),
+                         (%attrDecls;))>
+<!ATTLIST %restriction;
+    base      %QName;                  #IMPLIED
+    id        ID       #IMPLIED
+    %restrictionAttrs;>
+<!--
+        base and simpleType child are mutually exclusive,
+        one is required.
+
+        restriction is shared between simpleType and
+        simpleContent and complexContent (in XMLSchema.xsd).
+        restriction1 is for the latter cases, when this
+        is restricting a complex type, as is attrDecls.
+  -->
+<!ELEMENT %list; ((%annotation;)?,(%simpleType;)?)>
+<!ATTLIST %list;
+    itemType      %QName;             #IMPLIED
+    id        ID       #IMPLIED
+    %listAttrs;>
+<!--
+        itemType and simpleType child are mutually exclusive,
+        one is required
+  -->
+<!ELEMENT %union; ((%annotation;)?,(%simpleType;)*)>
+<!ATTLIST %union;
+    id            ID       #IMPLIED
+    memberTypes   %QNames;            #IMPLIED
+    %unionAttrs;>
+<!--
+        At least one item in memberTypes or one simpleType
+        child is required
+  -->
+
+<!ELEMENT %maxExclusive; %facetModel;>
+<!ATTLIST %maxExclusive;
+        %facetAttr;
+        %fixedAttr;
+        %maxExclusiveAttrs;>
+<!ELEMENT %minExclusive; %facetModel;>
+<!ATTLIST %minExclusive;
+        %facetAttr;
+        %fixedAttr;
+        %minExclusiveAttrs;>
+
+<!ELEMENT %maxInclusive; %facetModel;>
+<!ATTLIST %maxInclusive;
+        %facetAttr;
+        %fixedAttr;
+        %maxInclusiveAttrs;>
+<!ELEMENT %minInclusive; %facetModel;>
+<!ATTLIST %minInclusive;
+        %facetAttr;
+        %fixedAttr;
+        %minInclusiveAttrs;>
+
+<!ELEMENT %totalDigits; %facetModel;>
+<!ATTLIST %totalDigits;
+        %facetAttr;
+        %fixedAttr;
+        %totalDigitsAttrs;>
+<!ELEMENT %fractionDigits; %facetModel;>
+<!ATTLIST %fractionDigits;
+        %facetAttr;
+        %fixedAttr;
+        %fractionDigitsAttrs;>
+
+<!ELEMENT %length; %facetModel;>
+<!ATTLIST %length;
+        %facetAttr;
+        %fixedAttr;
+        %lengthAttrs;>
+<!ELEMENT %minLength; %facetModel;>
+<!ATTLIST %minLength;
+        %facetAttr;
+        %fixedAttr;
+        %minLengthAttrs;>
+<!ELEMENT %maxLength; %facetModel;>
+<!ATTLIST %maxLength;
+        %facetAttr;
+        %fixedAttr;
+        %maxLengthAttrs;>
+
+<!-- This one can be repeated -->
+<!ELEMENT %enumeration; %facetModel;>
+<!ATTLIST %enumeration;
+        %facetAttr;
+        %enumerationAttrs;>
+
+<!ELEMENT %whiteSpace; %facetModel;>
+<!ATTLIST %whiteSpace;
+        %facetAttr;
+        %fixedAttr;
+        %whiteSpaceAttrs;>
+
+<!-- This one can be repeated -->
+<!ELEMENT %pattern; %facetModel;>
+<!ATTLIST %pattern;
+        %facetAttr;
+        %patternAttrs;>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/docbook.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/docbook.xsd
new file mode 100644 (file)
index 0000000..f2c9aed
--- /dev/null
@@ -0,0 +1,17461 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:docbook="http://docbook.org/ns/docbook">
+  <xs:import namespace="http://www.w3.org/1999/xlink" schemaLocation="xlink.xsd"/>
+  <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
+  <xs:attributeGroup name="db.common.attributes">
+    <xs:attribute ref="xml:id"/>
+    <xs:attribute name="version"/>
+    <xs:attribute ref="xml:lang"/>
+    <xs:attribute ref="xml:base"/>
+    <xs:attribute name="remap"/>
+    <xs:attribute name="xreflabel"/>
+    <xs:attribute name="revisionflag">
+      <xs:simpleType>
+        <xs:restriction base="xs:token">
+          <xs:enumeration value="changed"/>
+          <xs:enumeration value="added"/>
+          <xs:enumeration value="deleted"/>
+          <xs:enumeration value="off"/>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="dir">
+      <xs:simpleType>
+        <xs:restriction base="xs:token">
+          <xs:enumeration value="ltr"/>
+          <xs:enumeration value="rtl"/>
+          <xs:enumeration value="lro"/>
+          <xs:enumeration value="rlo"/>
+        </xs:restriction>
+      </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="arch"/>
+    <xs:attribute name="audience"/>
+    <xs:attribute name="condition"/>
+    <xs:attribute name="conformance"/>
+    <xs:attribute name="os"/>
+    <xs:attribute name="revision"/>
+    <xs:attribute name="security"/>
+    <xs:attribute name="userlevel"/>
+    <xs:attribute name="vendor"/>
+    <xs:attribute name="wordsize"/>
+    <xs:attribute name="annotations"/>
+  </xs:attributeGroup>
+  <xs:attributeGroup name="db.common.linking.attributes">
+    <xs:attribute name="linkend" type="xs:IDREF"/>
+    <xs:attribute ref="xlink:href"/>
+    <xs:attribute ref="xlink:type"/>
+    <xs:attribute ref="xlink:role"/>
+    <xs:attribute ref="xlink:arcrole"/>
+    <xs:attribute ref="xlink:title"/>
+    <xs:attribute ref="xlink:show"/>
+    <xs:attribute ref="xlink:actuate"/>
+  </xs:attributeGroup>
+  <xs:element name="title">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="titleabbrev">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="subtitle">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="info">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:title"/>
+          <xs:element ref="docbook:titleabbrev"/>
+          <xs:element ref="docbook:subtitle"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:abstract"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:artpagenums"/>
+          <xs:element ref="docbook:author"/>
+          <xs:element ref="docbook:authorgroup"/>
+          <xs:element ref="docbook:authorinitials"/>
+          <xs:element ref="docbook:bibliocoverage"/>
+          <xs:element ref="docbook:biblioid"/>
+          <xs:element ref="docbook:bibliosource"/>
+          <xs:element ref="docbook:collab"/>
+          <xs:element ref="docbook:confgroup"/>
+          <xs:element ref="docbook:contractsponsor"/>
+          <xs:element ref="docbook:contractnum"/>
+          <xs:element ref="docbook:copyright"/>
+          <xs:element ref="docbook:cover"/>
+          <xs:element ref="docbook:date"/>
+          <xs:element ref="docbook:edition"/>
+          <xs:element ref="docbook:editor"/>
+          <xs:element ref="docbook:issuenum"/>
+          <xs:element ref="docbook:keywordset"/>
+          <xs:element ref="docbook:legalnotice"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:org"/>
+          <xs:element ref="docbook:orgname"/>
+          <xs:element ref="docbook:othercredit"/>
+          <xs:element ref="docbook:pagenums"/>
+          <xs:element ref="docbook:printhistory"/>
+          <xs:element ref="docbook:pubdate"/>
+          <xs:element ref="docbook:publisher"/>
+          <xs:element ref="docbook:publishername"/>
+          <xs:element ref="docbook:releaseinfo"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:seriesvolnums"/>
+          <xs:element ref="docbook:subjectset"/>
+          <xs:element ref="docbook:volumenum"/>
+          <xs:element ref="docbook:annotation"/>
+          <xs:element ref="docbook:extendedlink"/>
+          <xs:element ref="docbook:bibliomisc"/>
+          <xs:element ref="docbook:bibliomset"/>
+          <xs:element ref="docbook:bibliorelation"/>
+          <xs:element ref="docbook:biblioset"/>
+          <xs:element ref="docbook:itermset"/>
+          <xs:element ref="docbook:productname"/>
+          <xs:element ref="docbook:productnumber"/>
+        </xs:choice>
+        <xs:sequence>
+          <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other"/>
+        </xs:sequence>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="subjectset">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:subject"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="scheme" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="subject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:subjectterm"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="weight"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="subjectterm">
+    <xs:complexType mixed="true">
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="keywordset">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:keyword"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="keyword">
+    <xs:complexType mixed="true">
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="procedure">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:step"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="step">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:sequence minOccurs="0">
+              <xs:choice>
+                <xs:element ref="docbook:substeps"/>
+                <xs:element ref="docbook:stepalternatives"/>
+              </xs:choice>
+              <xs:choice minOccurs="0" maxOccurs="unbounded">
+                <xs:element ref="docbook:itemizedlist"/>
+                <xs:element ref="docbook:orderedlist"/>
+                <xs:element ref="docbook:procedure"/>
+                <xs:element ref="docbook:simplelist"/>
+                <xs:element ref="docbook:variablelist"/>
+                <xs:element ref="docbook:segmentedlist"/>
+                <xs:element ref="docbook:glosslist"/>
+                <xs:element ref="docbook:bibliolist"/>
+                <xs:element ref="docbook:calloutlist"/>
+                <xs:element ref="docbook:qandaset"/>
+                <xs:element ref="docbook:example"/>
+                <xs:element ref="docbook:figure"/>
+                <xs:element ref="docbook:table"/>
+                <xs:element ref="docbook:equation"/>
+                <xs:element ref="docbook:informalexample"/>
+                <xs:element ref="docbook:informalfigure"/>
+                <xs:element ref="docbook:informaltable"/>
+                <xs:element ref="docbook:informalequation"/>
+                <xs:element ref="docbook:sidebar"/>
+                <xs:element ref="docbook:blockquote"/>
+                <xs:element ref="docbook:address"/>
+                <xs:element ref="docbook:epigraph"/>
+                <xs:element ref="docbook:mediaobject"/>
+                <xs:element ref="docbook:screenshot"/>
+                <xs:element ref="docbook:task"/>
+                <xs:element ref="docbook:productionset"/>
+                <xs:element ref="docbook:constraintdef"/>
+                <xs:element ref="docbook:msgset"/>
+                <xs:element ref="docbook:screen"/>
+                <xs:element ref="docbook:literallayout"/>
+                <xs:element ref="docbook:programlistingco"/>
+                <xs:element ref="docbook:screenco"/>
+                <xs:element ref="docbook:programlisting"/>
+                <xs:element ref="docbook:synopsis"/>
+                <xs:element ref="docbook:bridgehead"/>
+                <xs:element ref="docbook:remark"/>
+                <xs:element ref="docbook:revhistory"/>
+                <xs:element ref="docbook:indexterm"/>
+                <xs:element ref="docbook:funcsynopsis"/>
+                <xs:element ref="docbook:classsynopsis"/>
+                <xs:element ref="docbook:methodsynopsis"/>
+                <xs:element ref="docbook:constructorsynopsis"/>
+                <xs:element ref="docbook:destructorsynopsis"/>
+                <xs:element ref="docbook:fieldsynopsis"/>
+                <xs:element ref="docbook:cmdsynopsis"/>
+                <xs:element ref="docbook:caution"/>
+                <xs:element ref="docbook:important"/>
+                <xs:element ref="docbook:note"/>
+                <xs:element ref="docbook:tip"/>
+                <xs:element ref="docbook:warning"/>
+                <xs:element ref="docbook:anchor"/>
+                <xs:element ref="docbook:para"/>
+                <xs:element ref="docbook:formalpara"/>
+                <xs:element ref="docbook:simpara"/>
+                <xs:element ref="docbook:annotation"/>
+              </xs:choice>
+            </xs:sequence>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:choice>
+              <xs:element ref="docbook:substeps"/>
+              <xs:element ref="docbook:stepalternatives"/>
+            </xs:choice>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+          </xs:sequence>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="performance">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="optional"/>
+            <xs:enumeration value="required"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="stepalternatives">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:step"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="performance">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="optional"/>
+            <xs:enumeration value="required"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="substeps">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:step"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="performance">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="optional"/>
+            <xs:enumeration value="required"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sidebar">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abstract">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="personblurb">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="blockquote">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:attribution"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="attribution">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citation"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bridgehead">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="renderas">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="sect1"/>
+            <xs:enumeration value="sect2"/>
+            <xs:enumeration value="sect3"/>
+            <xs:enumeration value="sect4"/>
+            <xs:enumeration value="sect5"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherrenderas" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="remark">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="epigraph">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element minOccurs="0" ref="docbook:attribution"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:literallayout"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="footnote">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+        <xs:element ref="docbook:annotation"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="formalpara">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexterm"/>
+        <xs:element ref="docbook:para"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="para">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="simpara">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="itemizedlist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:listitem"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="spacing">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="compact"/>
+            <xs:enumeration value="normal"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="mark" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="orderedlist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:listitem"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="spacing">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="compact"/>
+            <xs:enumeration value="normal"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startingnumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="inheritnum">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="ignore"/>
+            <xs:enumeration value="inherit"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="numeration">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="arabic"/>
+            <xs:enumeration value="upperalpha"/>
+            <xs:enumeration value="loweralpha"/>
+            <xs:enumeration value="upperroman"/>
+            <xs:enumeration value="lowerroman"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="listitem">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+        <xs:element ref="docbook:annotation"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="override" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="segmentedlist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:segtitle"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:seglistitem"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="segtitle">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="seglistitem">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:seg"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="seg">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="simplelist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:member"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="type" default="vert">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="horiz"/>
+            <xs:enumeration value="vert"/>
+            <xs:enumeration value="inline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="columns" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="member">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="variablelist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:varlistentry"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="spacing">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="compact"/>
+            <xs:enumeration value="normal"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="termlength"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="varlistentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:term"/>
+        <xs:element ref="docbook:listitem"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="term">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="example">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:caption"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="floatstyle"/>
+      <xs:attribute name="width" type="xs:NMTOKEN"/>
+      <xs:attribute name="pgwide">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="informalexample">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:caption"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="floatstyle"/>
+      <xs:attribute name="width" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="literallayout">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:textobject"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:lineannotation"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="linenumbering">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="numbered"/>
+            <xs:enumeration value="unnumbered"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startinglinenumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="language"/>
+      <xs:attribute ref="xml:space"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="monospaced"/>
+            <xs:enumeration value="normal"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="screen">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:textobject"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:lineannotation"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="linenumbering">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="numbered"/>
+            <xs:enumeration value="unnumbered"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startinglinenumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="language"/>
+      <xs:attribute ref="xml:space"/>
+      <xs:attribute name="width" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="screenshot">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element ref="docbook:mediaobject"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="figure">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:caption"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="pgwide">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="floatstyle"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="informalfigure">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:caption"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="pgwide">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="floatstyle"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="mediaobject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element minOccurs="0" ref="docbook:alt"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:videoobject"/>
+          <xs:element ref="docbook:audioobject"/>
+          <xs:element ref="docbook:imageobject"/>
+          <xs:element ref="docbook:textobject"/>
+          <xs:element ref="docbook:imageobjectco"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:caption"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="inlinemediaobject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element minOccurs="0" ref="docbook:alt"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:videoobject"/>
+          <xs:element ref="docbook:audioobject"/>
+          <xs:element ref="docbook:imageobject"/>
+          <xs:element ref="docbook:textobject"/>
+          <xs:element ref="docbook:imageobjectco"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="videoobject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element ref="docbook:videodata"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="audioobject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element ref="docbook:audiodata"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="imageobject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element ref="docbook:imagedata"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="textobject">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:choice>
+          <xs:element ref="docbook:phrase"/>
+          <xs:element ref="docbook:textdata"/>
+          <xs:choice maxOccurs="unbounded">
+            <xs:element ref="docbook:itemizedlist"/>
+            <xs:element ref="docbook:orderedlist"/>
+            <xs:element ref="docbook:procedure"/>
+            <xs:element ref="docbook:simplelist"/>
+            <xs:element ref="docbook:variablelist"/>
+            <xs:element ref="docbook:segmentedlist"/>
+            <xs:element ref="docbook:glosslist"/>
+            <xs:element ref="docbook:bibliolist"/>
+            <xs:element ref="docbook:calloutlist"/>
+            <xs:element ref="docbook:qandaset"/>
+            <xs:element ref="docbook:example"/>
+            <xs:element ref="docbook:figure"/>
+            <xs:element ref="docbook:table"/>
+            <xs:element ref="docbook:equation"/>
+            <xs:element ref="docbook:informalexample"/>
+            <xs:element ref="docbook:informalfigure"/>
+            <xs:element ref="docbook:informaltable"/>
+            <xs:element ref="docbook:informalequation"/>
+            <xs:element ref="docbook:sidebar"/>
+            <xs:element ref="docbook:blockquote"/>
+            <xs:element ref="docbook:address"/>
+            <xs:element ref="docbook:epigraph"/>
+            <xs:element ref="docbook:mediaobject"/>
+            <xs:element ref="docbook:screenshot"/>
+            <xs:element ref="docbook:task"/>
+            <xs:element ref="docbook:productionset"/>
+            <xs:element ref="docbook:constraintdef"/>
+            <xs:element ref="docbook:msgset"/>
+            <xs:element ref="docbook:screen"/>
+            <xs:element ref="docbook:literallayout"/>
+            <xs:element ref="docbook:programlistingco"/>
+            <xs:element ref="docbook:screenco"/>
+            <xs:element ref="docbook:programlisting"/>
+            <xs:element ref="docbook:synopsis"/>
+            <xs:element ref="docbook:bridgehead"/>
+            <xs:element ref="docbook:remark"/>
+            <xs:element ref="docbook:revhistory"/>
+            <xs:element ref="docbook:indexterm"/>
+            <xs:element ref="docbook:funcsynopsis"/>
+            <xs:element ref="docbook:classsynopsis"/>
+            <xs:element ref="docbook:methodsynopsis"/>
+            <xs:element ref="docbook:constructorsynopsis"/>
+            <xs:element ref="docbook:destructorsynopsis"/>
+            <xs:element ref="docbook:fieldsynopsis"/>
+            <xs:element ref="docbook:cmdsynopsis"/>
+            <xs:element ref="docbook:caution"/>
+            <xs:element ref="docbook:important"/>
+            <xs:element ref="docbook:note"/>
+            <xs:element ref="docbook:tip"/>
+            <xs:element ref="docbook:warning"/>
+            <xs:element ref="docbook:anchor"/>
+            <xs:element ref="docbook:para"/>
+            <xs:element ref="docbook:formalpara"/>
+            <xs:element ref="docbook:simpara"/>
+            <xs:element ref="docbook:annotation"/>
+          </xs:choice>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="videodata">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="format"/>
+      <xs:attribute name="fileref"/>
+      <xs:attribute name="entityref" type="xs:ENTITY"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="right"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="top"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="width"/>
+      <xs:attribute name="contentwidth"/>
+      <xs:attribute name="scalefit">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="scale" type="xs:NMTOKEN"/>
+      <xs:attribute name="depth"/>
+      <xs:attribute name="contentdepth"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="audiodata">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="format"/>
+      <xs:attribute name="fileref"/>
+      <xs:attribute name="entityref" type="xs:ENTITY"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="imagedata">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="format"/>
+      <xs:attribute name="fileref"/>
+      <xs:attribute name="entityref" type="xs:ENTITY"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="right"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="top"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="width"/>
+      <xs:attribute name="contentwidth"/>
+      <xs:attribute name="scalefit">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="scale" type="xs:NMTOKEN"/>
+      <xs:attribute name="depth"/>
+      <xs:attribute name="contentdepth"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="textdata">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="format"/>
+      <xs:attribute name="fileref"/>
+      <xs:attribute name="entityref" type="xs:ENTITY"/>
+      <xs:attribute name="encoding"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="caption">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+        <xs:element ref="docbook:annotation"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="address">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:pob"/>
+        <xs:element ref="docbook:street"/>
+        <xs:element ref="docbook:city"/>
+        <xs:element ref="docbook:state"/>
+        <xs:element ref="docbook:postcode"/>
+        <xs:element ref="docbook:country"/>
+        <xs:element ref="docbook:phone"/>
+        <xs:element ref="docbook:fax"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:otheraddr"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="linenumbering">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="numbered"/>
+            <xs:enumeration value="unnumbered"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startinglinenumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="language"/>
+      <xs:attribute ref="xml:space"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="street">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="pob">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="postcode">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="city">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="state">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="country">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="phone">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="fax">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="otheraddr">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="affiliation">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:shortaffil"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:jobtitle"/>
+        <xs:choice>
+          <xs:element minOccurs="0" ref="docbook:org"/>
+          <xs:sequence>
+            <xs:element minOccurs="0" ref="docbook:orgname"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:orgdiv"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:address"/>
+          </xs:sequence>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="shortaffil">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="jobtitle">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="orgname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="consortium"/>
+            <xs:enumeration value="corporation"/>
+            <xs:enumeration value="informal"/>
+            <xs:enumeration value="nonprofit"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherclass"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="orgdiv">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="artpagenums">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="personname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:honorific"/>
+        <xs:element ref="docbook:firstname"/>
+        <xs:element ref="docbook:surname"/>
+        <xs:element ref="docbook:lineage"/>
+        <xs:element ref="docbook:othername"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="author">
+    <xs:complexType>
+      <xs:choice>
+        <xs:sequence>
+          <xs:element ref="docbook:personname"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:personblurb"/>
+            <xs:element ref="docbook:affiliation"/>
+            <xs:element ref="docbook:email"/>
+            <xs:element ref="docbook:uri"/>
+            <xs:element ref="docbook:address"/>
+            <xs:element ref="docbook:contrib"/>
+          </xs:choice>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:element ref="docbook:orgname"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:orgdiv"/>
+            <xs:element ref="docbook:affiliation"/>
+            <xs:element ref="docbook:email"/>
+            <xs:element ref="docbook:uri"/>
+            <xs:element ref="docbook:address"/>
+            <xs:element ref="docbook:contrib"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="authorgroup">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:othercredit"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="collab">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:person"/>
+          <xs:element ref="docbook:personname"/>
+          <xs:element ref="docbook:org"/>
+          <xs:element ref="docbook:orgname"/>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:affiliation"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="authorinitials">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="person">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:personname"/>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:affiliation"/>
+          <xs:element ref="docbook:email"/>
+          <xs:element ref="docbook:uri"/>
+          <xs:element ref="docbook:personblurb"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="org">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:orgname"/>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:affiliation"/>
+          <xs:element ref="docbook:email"/>
+          <xs:element ref="docbook:uri"/>
+          <xs:element ref="docbook:orgdiv"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="confgroup">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:confdates"/>
+        <xs:element ref="docbook:conftitle"/>
+        <xs:element ref="docbook:confnum"/>
+        <xs:element ref="docbook:confsponsor"/>
+        <xs:element ref="docbook:address"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="confdates">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="conftitle">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="confnum">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="confsponsor">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="contractnum">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="contractsponsor">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="copyright">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:year"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:holder"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="year">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="holder">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="cover">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="date">
+    <xs:complexType mixed="true">
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="edition">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="editor">
+    <xs:complexType>
+      <xs:choice>
+        <xs:sequence>
+          <xs:element ref="docbook:personname"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:personblurb"/>
+            <xs:element ref="docbook:affiliation"/>
+            <xs:element ref="docbook:email"/>
+            <xs:element ref="docbook:uri"/>
+            <xs:element ref="docbook:address"/>
+            <xs:element ref="docbook:contrib"/>
+          </xs:choice>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:element ref="docbook:orgname"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:orgdiv"/>
+            <xs:element ref="docbook:affiliation"/>
+            <xs:element ref="docbook:email"/>
+            <xs:element ref="docbook:uri"/>
+            <xs:element ref="docbook:address"/>
+            <xs:element ref="docbook:contrib"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="biblioid">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="doi"/>
+            <xs:enumeration value="isbn"/>
+            <xs:enumeration value="isrn"/>
+            <xs:enumeration value="issn"/>
+            <xs:enumeration value="libraryofcongress"/>
+            <xs:enumeration value="pubsnumber"/>
+            <xs:enumeration value="uri"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherclass" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="citebiblioid">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="doi"/>
+            <xs:enumeration value="isbn"/>
+            <xs:enumeration value="isrn"/>
+            <xs:enumeration value="issn"/>
+            <xs:enumeration value="libraryofcongress"/>
+            <xs:enumeration value="pubsnumber"/>
+            <xs:enumeration value="uri"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherclass" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliosource">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="doi"/>
+            <xs:enumeration value="isbn"/>
+            <xs:enumeration value="isrn"/>
+            <xs:enumeration value="issn"/>
+            <xs:enumeration value="libraryofcongress"/>
+            <xs:enumeration value="pubsnumber"/>
+            <xs:enumeration value="uri"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherclass" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliorelation">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="doi"/>
+            <xs:enumeration value="isbn"/>
+            <xs:enumeration value="isrn"/>
+            <xs:enumeration value="issn"/>
+            <xs:enumeration value="libraryofcongress"/>
+            <xs:enumeration value="pubsnumber"/>
+            <xs:enumeration value="uri"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherclass" type="xs:NMTOKEN"/>
+      <xs:attribute name="type">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="hasformat"/>
+            <xs:enumeration value="haspart"/>
+            <xs:enumeration value="hasversion"/>
+            <xs:enumeration value="isformatof"/>
+            <xs:enumeration value="ispartof"/>
+            <xs:enumeration value="isreferencedby"/>
+            <xs:enumeration value="isreplacedby"/>
+            <xs:enumeration value="isrequiredby"/>
+            <xs:enumeration value="isversionof"/>
+            <xs:enumeration value="references"/>
+            <xs:enumeration value="replaces"/>
+            <xs:enumeration value="requires"/>
+            <xs:enumeration value="othertype"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="othertype" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliocoverage">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="spatial">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="dcmipoint"/>
+            <xs:enumeration value="iso3166"/>
+            <xs:enumeration value="dcmibox"/>
+            <xs:enumeration value="tgn"/>
+            <xs:enumeration value="otherspatial"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherspatial" type="xs:NMTOKEN"/>
+      <xs:attribute name="temporal">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="dcmiperiod"/>
+            <xs:enumeration value="w3c-dtf"/>
+            <xs:enumeration value="othertemporal"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="othertemporal" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="legalnotice">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="othercredit">
+    <xs:complexType>
+      <xs:choice>
+        <xs:sequence>
+          <xs:element ref="docbook:personname"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:personblurb"/>
+            <xs:element ref="docbook:affiliation"/>
+            <xs:element ref="docbook:email"/>
+            <xs:element ref="docbook:uri"/>
+            <xs:element ref="docbook:address"/>
+            <xs:element ref="docbook:contrib"/>
+          </xs:choice>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:element ref="docbook:orgname"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:orgdiv"/>
+            <xs:element ref="docbook:affiliation"/>
+            <xs:element ref="docbook:email"/>
+            <xs:element ref="docbook:uri"/>
+            <xs:element ref="docbook:address"/>
+            <xs:element ref="docbook:contrib"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="copyeditor"/>
+            <xs:enumeration value="graphicdesigner"/>
+            <xs:enumeration value="other"/>
+            <xs:enumeration value="productioneditor"/>
+            <xs:enumeration value="technicaleditor"/>
+            <xs:enumeration value="translator"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherclass" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="pagenums">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="contrib">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="honorific">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="firstname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="surname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="lineage">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="othername">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="printhistory">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="pubdate">
+    <xs:complexType mixed="true">
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="publisher">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:publishername"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:address"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="publishername">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="releaseinfo">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="revhistory">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:revision"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="revision">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:revnumber"/>
+        <xs:element ref="docbook:date"/>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:authorinitials"/>
+          <xs:element ref="docbook:author"/>
+        </xs:choice>
+        <xs:choice minOccurs="0">
+          <xs:element ref="docbook:revremark"/>
+          <xs:element ref="docbook:revdescription"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="revnumber">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="revremark">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="revdescription">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+        <xs:element ref="docbook:annotation"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="seriesvolnums">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="volumenum">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="issuenum">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="package">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="email">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="lineannotation">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="parameter">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="command"/>
+            <xs:enumeration value="function"/>
+            <xs:enumeration value="option"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="replaceable">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="command"/>
+            <xs:enumeration value="function"/>
+            <xs:enumeration value="option"/>
+            <xs:enumeration value="parameter"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="uri">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="type"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="abbrev">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:trademark"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="acronym">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:trademark"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="citation">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="citerefentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:refentrytitle"/>
+        <xs:element minOccurs="0" ref="docbook:manvolnum"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refentrytitle">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="manvolnum">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="citetitle">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="pubwork">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="article"/>
+            <xs:enumeration value="bbs"/>
+            <xs:enumeration value="book"/>
+            <xs:enumeration value="cdrom"/>
+            <xs:enumeration value="chapter"/>
+            <xs:enumeration value="dvd"/>
+            <xs:enumeration value="emailmessage"/>
+            <xs:enumeration value="gopher"/>
+            <xs:enumeration value="journal"/>
+            <xs:enumeration value="manuscript"/>
+            <xs:enumeration value="newsposting"/>
+            <xs:enumeration value="part"/>
+            <xs:enumeration value="refentry"/>
+            <xs:enumeration value="section"/>
+            <xs:enumeration value="series"/>
+            <xs:enumeration value="set"/>
+            <xs:enumeration value="webpage"/>
+            <xs:enumeration value="wiki"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="emphasis">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="foreignphrase">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="phrase">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="quote">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="subscript">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="superscript">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="trademark">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="copyright"/>
+            <xs:enumeration value="registered"/>
+            <xs:enumeration value="service"/>
+            <xs:enumeration value="trade"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="wordasword">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="footnoteref">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="xref">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="xrefstyle"/>
+      <xs:attribute name="endterm" type="xs:IDREF"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="link">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="xrefstyle"/>
+      <xs:attribute name="endterm" type="xs:IDREF"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="olink">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="targetdoc"/>
+      <xs:attribute name="role"/>
+      <xs:attribute name="xrefstyle"/>
+      <xs:attribute name="localinfo"/>
+      <xs:attribute name="targetptr"/>
+      <xs:attribute name="type"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="anchor">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="alt">
+    <xs:complexType mixed="true">
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:inlinemediaobject"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="set">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:toc"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:set"/>
+          <xs:element ref="docbook:book"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:setindex"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="book">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+          <xs:element ref="docbook:dedication"/>
+          <xs:element ref="docbook:acknowledgements"/>
+          <xs:element ref="docbook:preface"/>
+          <xs:element ref="docbook:chapter"/>
+          <xs:element ref="docbook:appendix"/>
+          <xs:element ref="docbook:article"/>
+          <xs:element ref="docbook:colophon"/>
+          <xs:element ref="docbook:part"/>
+          <xs:element ref="docbook:reference"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="dedication">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="acknowledgements">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="colophon">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="appendix">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:glossary"/>
+            <xs:element ref="docbook:bibliography"/>
+            <xs:element ref="docbook:index"/>
+            <xs:element ref="docbook:toc"/>
+          </xs:choice>
+          <xs:choice>
+            <xs:sequence>
+              <xs:choice maxOccurs="unbounded">
+                <xs:element ref="docbook:itemizedlist"/>
+                <xs:element ref="docbook:orderedlist"/>
+                <xs:element ref="docbook:procedure"/>
+                <xs:element ref="docbook:simplelist"/>
+                <xs:element ref="docbook:variablelist"/>
+                <xs:element ref="docbook:segmentedlist"/>
+                <xs:element ref="docbook:glosslist"/>
+                <xs:element ref="docbook:bibliolist"/>
+                <xs:element ref="docbook:calloutlist"/>
+                <xs:element ref="docbook:qandaset"/>
+                <xs:element ref="docbook:example"/>
+                <xs:element ref="docbook:figure"/>
+                <xs:element ref="docbook:table"/>
+                <xs:element ref="docbook:equation"/>
+                <xs:element ref="docbook:informalexample"/>
+                <xs:element ref="docbook:informalfigure"/>
+                <xs:element ref="docbook:informaltable"/>
+                <xs:element ref="docbook:informalequation"/>
+                <xs:element ref="docbook:sidebar"/>
+                <xs:element ref="docbook:blockquote"/>
+                <xs:element ref="docbook:address"/>
+                <xs:element ref="docbook:epigraph"/>
+                <xs:element ref="docbook:mediaobject"/>
+                <xs:element ref="docbook:screenshot"/>
+                <xs:element ref="docbook:task"/>
+                <xs:element ref="docbook:productionset"/>
+                <xs:element ref="docbook:constraintdef"/>
+                <xs:element ref="docbook:msgset"/>
+                <xs:element ref="docbook:screen"/>
+                <xs:element ref="docbook:literallayout"/>
+                <xs:element ref="docbook:programlistingco"/>
+                <xs:element ref="docbook:screenco"/>
+                <xs:element ref="docbook:programlisting"/>
+                <xs:element ref="docbook:synopsis"/>
+                <xs:element ref="docbook:bridgehead"/>
+                <xs:element ref="docbook:remark"/>
+                <xs:element ref="docbook:revhistory"/>
+                <xs:element ref="docbook:indexterm"/>
+                <xs:element ref="docbook:funcsynopsis"/>
+                <xs:element ref="docbook:classsynopsis"/>
+                <xs:element ref="docbook:methodsynopsis"/>
+                <xs:element ref="docbook:constructorsynopsis"/>
+                <xs:element ref="docbook:destructorsynopsis"/>
+                <xs:element ref="docbook:fieldsynopsis"/>
+                <xs:element ref="docbook:cmdsynopsis"/>
+                <xs:element ref="docbook:caution"/>
+                <xs:element ref="docbook:important"/>
+                <xs:element ref="docbook:note"/>
+                <xs:element ref="docbook:tip"/>
+                <xs:element ref="docbook:warning"/>
+                <xs:element ref="docbook:anchor"/>
+                <xs:element ref="docbook:para"/>
+                <xs:element ref="docbook:formalpara"/>
+                <xs:element ref="docbook:simpara"/>
+                <xs:element ref="docbook:annotation"/>
+              </xs:choice>
+              <xs:choice minOccurs="0">
+                <xs:sequence>
+                  <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+                </xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+                <xs:sequence>
+                  <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+                </xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+              </xs:choice>
+            </xs:sequence>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+          </xs:choice>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:glossary"/>
+            <xs:element ref="docbook:bibliography"/>
+            <xs:element ref="docbook:index"/>
+            <xs:element ref="docbook:toc"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="chapter">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:glossary"/>
+            <xs:element ref="docbook:bibliography"/>
+            <xs:element ref="docbook:index"/>
+            <xs:element ref="docbook:toc"/>
+          </xs:choice>
+          <xs:choice>
+            <xs:sequence>
+              <xs:choice maxOccurs="unbounded">
+                <xs:element ref="docbook:itemizedlist"/>
+                <xs:element ref="docbook:orderedlist"/>
+                <xs:element ref="docbook:procedure"/>
+                <xs:element ref="docbook:simplelist"/>
+                <xs:element ref="docbook:variablelist"/>
+                <xs:element ref="docbook:segmentedlist"/>
+                <xs:element ref="docbook:glosslist"/>
+                <xs:element ref="docbook:bibliolist"/>
+                <xs:element ref="docbook:calloutlist"/>
+                <xs:element ref="docbook:qandaset"/>
+                <xs:element ref="docbook:example"/>
+                <xs:element ref="docbook:figure"/>
+                <xs:element ref="docbook:table"/>
+                <xs:element ref="docbook:equation"/>
+                <xs:element ref="docbook:informalexample"/>
+                <xs:element ref="docbook:informalfigure"/>
+                <xs:element ref="docbook:informaltable"/>
+                <xs:element ref="docbook:informalequation"/>
+                <xs:element ref="docbook:sidebar"/>
+                <xs:element ref="docbook:blockquote"/>
+                <xs:element ref="docbook:address"/>
+                <xs:element ref="docbook:epigraph"/>
+                <xs:element ref="docbook:mediaobject"/>
+                <xs:element ref="docbook:screenshot"/>
+                <xs:element ref="docbook:task"/>
+                <xs:element ref="docbook:productionset"/>
+                <xs:element ref="docbook:constraintdef"/>
+                <xs:element ref="docbook:msgset"/>
+                <xs:element ref="docbook:screen"/>
+                <xs:element ref="docbook:literallayout"/>
+                <xs:element ref="docbook:programlistingco"/>
+                <xs:element ref="docbook:screenco"/>
+                <xs:element ref="docbook:programlisting"/>
+                <xs:element ref="docbook:synopsis"/>
+                <xs:element ref="docbook:bridgehead"/>
+                <xs:element ref="docbook:remark"/>
+                <xs:element ref="docbook:revhistory"/>
+                <xs:element ref="docbook:indexterm"/>
+                <xs:element ref="docbook:funcsynopsis"/>
+                <xs:element ref="docbook:classsynopsis"/>
+                <xs:element ref="docbook:methodsynopsis"/>
+                <xs:element ref="docbook:constructorsynopsis"/>
+                <xs:element ref="docbook:destructorsynopsis"/>
+                <xs:element ref="docbook:fieldsynopsis"/>
+                <xs:element ref="docbook:cmdsynopsis"/>
+                <xs:element ref="docbook:caution"/>
+                <xs:element ref="docbook:important"/>
+                <xs:element ref="docbook:note"/>
+                <xs:element ref="docbook:tip"/>
+                <xs:element ref="docbook:warning"/>
+                <xs:element ref="docbook:anchor"/>
+                <xs:element ref="docbook:para"/>
+                <xs:element ref="docbook:formalpara"/>
+                <xs:element ref="docbook:simpara"/>
+                <xs:element ref="docbook:annotation"/>
+              </xs:choice>
+              <xs:choice minOccurs="0">
+                <xs:sequence>
+                  <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+                </xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+                <xs:sequence>
+                  <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+                </xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+              </xs:choice>
+            </xs:sequence>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+          </xs:choice>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:glossary"/>
+            <xs:element ref="docbook:bibliography"/>
+            <xs:element ref="docbook:index"/>
+            <xs:element ref="docbook:toc"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="part">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:partintro"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+          <xs:element ref="docbook:dedication"/>
+          <xs:element ref="docbook:acknowledgements"/>
+          <xs:element ref="docbook:preface"/>
+          <xs:element ref="docbook:chapter"/>
+          <xs:element ref="docbook:appendix"/>
+          <xs:element ref="docbook:article"/>
+          <xs:element ref="docbook:colophon"/>
+          <xs:element ref="docbook:refentry"/>
+          <xs:element ref="docbook:reference"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="preface">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:glossary"/>
+            <xs:element ref="docbook:bibliography"/>
+            <xs:element ref="docbook:index"/>
+            <xs:element ref="docbook:toc"/>
+          </xs:choice>
+          <xs:choice>
+            <xs:sequence>
+              <xs:choice maxOccurs="unbounded">
+                <xs:element ref="docbook:itemizedlist"/>
+                <xs:element ref="docbook:orderedlist"/>
+                <xs:element ref="docbook:procedure"/>
+                <xs:element ref="docbook:simplelist"/>
+                <xs:element ref="docbook:variablelist"/>
+                <xs:element ref="docbook:segmentedlist"/>
+                <xs:element ref="docbook:glosslist"/>
+                <xs:element ref="docbook:bibliolist"/>
+                <xs:element ref="docbook:calloutlist"/>
+                <xs:element ref="docbook:qandaset"/>
+                <xs:element ref="docbook:example"/>
+                <xs:element ref="docbook:figure"/>
+                <xs:element ref="docbook:table"/>
+                <xs:element ref="docbook:equation"/>
+                <xs:element ref="docbook:informalexample"/>
+                <xs:element ref="docbook:informalfigure"/>
+                <xs:element ref="docbook:informaltable"/>
+                <xs:element ref="docbook:informalequation"/>
+                <xs:element ref="docbook:sidebar"/>
+                <xs:element ref="docbook:blockquote"/>
+                <xs:element ref="docbook:address"/>
+                <xs:element ref="docbook:epigraph"/>
+                <xs:element ref="docbook:mediaobject"/>
+                <xs:element ref="docbook:screenshot"/>
+                <xs:element ref="docbook:task"/>
+                <xs:element ref="docbook:productionset"/>
+                <xs:element ref="docbook:constraintdef"/>
+                <xs:element ref="docbook:msgset"/>
+                <xs:element ref="docbook:screen"/>
+                <xs:element ref="docbook:literallayout"/>
+                <xs:element ref="docbook:programlistingco"/>
+                <xs:element ref="docbook:screenco"/>
+                <xs:element ref="docbook:programlisting"/>
+                <xs:element ref="docbook:synopsis"/>
+                <xs:element ref="docbook:bridgehead"/>
+                <xs:element ref="docbook:remark"/>
+                <xs:element ref="docbook:revhistory"/>
+                <xs:element ref="docbook:indexterm"/>
+                <xs:element ref="docbook:funcsynopsis"/>
+                <xs:element ref="docbook:classsynopsis"/>
+                <xs:element ref="docbook:methodsynopsis"/>
+                <xs:element ref="docbook:constructorsynopsis"/>
+                <xs:element ref="docbook:destructorsynopsis"/>
+                <xs:element ref="docbook:fieldsynopsis"/>
+                <xs:element ref="docbook:cmdsynopsis"/>
+                <xs:element ref="docbook:caution"/>
+                <xs:element ref="docbook:important"/>
+                <xs:element ref="docbook:note"/>
+                <xs:element ref="docbook:tip"/>
+                <xs:element ref="docbook:warning"/>
+                <xs:element ref="docbook:anchor"/>
+                <xs:element ref="docbook:para"/>
+                <xs:element ref="docbook:formalpara"/>
+                <xs:element ref="docbook:simpara"/>
+                <xs:element ref="docbook:annotation"/>
+              </xs:choice>
+              <xs:choice minOccurs="0">
+                <xs:sequence>
+                  <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+                </xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+                <xs:sequence>
+                  <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+                  <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+                </xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+              </xs:choice>
+            </xs:sequence>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+          </xs:choice>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:glossary"/>
+            <xs:element ref="docbook:bibliography"/>
+            <xs:element ref="docbook:index"/>
+            <xs:element ref="docbook:toc"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="partintro">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="section">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+              <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="simplesect">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="article">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+          <xs:element ref="docbook:appendix"/>
+          <xs:element ref="docbook:acknowledgements"/>
+          <xs:element ref="docbook:colophon"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:section"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:sect1"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+          <xs:element ref="docbook:appendix"/>
+          <xs:element ref="docbook:acknowledgements"/>
+          <xs:element ref="docbook:colophon"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="faq"/>
+            <xs:enumeration value="journalarticle"/>
+            <xs:enumeration value="productsheet"/>
+            <xs:enumeration value="specification"/>
+            <xs:enumeration value="techreport"/>
+            <xs:enumeration value="whitepaper"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="annotation">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attribute name="annotates"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="extendedlink">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:locator"/>
+        <xs:element ref="docbook:arc"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="locator">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute ref="xlink:label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="arc">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute ref="xlink:from"/>
+      <xs:attribute ref="xlink:to"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sect1">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:sect2"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:sect2"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sect2">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:sect3"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:sect3"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sect3">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:sect4"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:sect4"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sect4">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element maxOccurs="unbounded" ref="docbook:sect5"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+              </xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:sect5"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sect5">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:simplesect"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplesect"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:glossary"/>
+          <xs:element ref="docbook:bibliography"/>
+          <xs:element ref="docbook:index"/>
+          <xs:element ref="docbook:toc"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="reference">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:partintro"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:refentry"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="status"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexterm"/>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element minOccurs="0" ref="docbook:refmeta"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:refnamediv"/>
+        <xs:element minOccurs="0" ref="docbook:refsynopsisdiv"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:refsection"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:refsect1"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="status"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refmeta">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexterm"/>
+        <xs:element ref="docbook:refentrytitle"/>
+        <xs:element minOccurs="0" ref="docbook:manvolnum"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:refmiscinfo"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexterm"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refmiscinfo">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="source"/>
+            <xs:enumeration value="version"/>
+            <xs:enumeration value="manual"/>
+            <xs:enumeration value="sectdesc"/>
+            <xs:enumeration value="software"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherclass"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refnamediv">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:refdescriptor"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:refname"/>
+        <xs:element ref="docbook:refpurpose"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:refclass"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refdescriptor">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refpurpose">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refclass">
+    <xs:complexType mixed="true">
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:application"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refsynopsisdiv">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:choice minOccurs="0">
+              <xs:element maxOccurs="unbounded" ref="docbook:refsection"/>
+              <xs:element maxOccurs="unbounded" ref="docbook:refsect2"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:refsection"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:refsect2"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refsection">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:refsection"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:refsection"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="status"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refsect1">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:refsect2"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:refsect2"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refsect2">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:sequence>
+            <xs:choice maxOccurs="unbounded">
+              <xs:element ref="docbook:itemizedlist"/>
+              <xs:element ref="docbook:orderedlist"/>
+              <xs:element ref="docbook:procedure"/>
+              <xs:element ref="docbook:simplelist"/>
+              <xs:element ref="docbook:variablelist"/>
+              <xs:element ref="docbook:segmentedlist"/>
+              <xs:element ref="docbook:glosslist"/>
+              <xs:element ref="docbook:bibliolist"/>
+              <xs:element ref="docbook:calloutlist"/>
+              <xs:element ref="docbook:qandaset"/>
+              <xs:element ref="docbook:example"/>
+              <xs:element ref="docbook:figure"/>
+              <xs:element ref="docbook:table"/>
+              <xs:element ref="docbook:equation"/>
+              <xs:element ref="docbook:informalexample"/>
+              <xs:element ref="docbook:informalfigure"/>
+              <xs:element ref="docbook:informaltable"/>
+              <xs:element ref="docbook:informalequation"/>
+              <xs:element ref="docbook:sidebar"/>
+              <xs:element ref="docbook:blockquote"/>
+              <xs:element ref="docbook:address"/>
+              <xs:element ref="docbook:epigraph"/>
+              <xs:element ref="docbook:mediaobject"/>
+              <xs:element ref="docbook:screenshot"/>
+              <xs:element ref="docbook:task"/>
+              <xs:element ref="docbook:productionset"/>
+              <xs:element ref="docbook:constraintdef"/>
+              <xs:element ref="docbook:msgset"/>
+              <xs:element ref="docbook:screen"/>
+              <xs:element ref="docbook:literallayout"/>
+              <xs:element ref="docbook:programlistingco"/>
+              <xs:element ref="docbook:screenco"/>
+              <xs:element ref="docbook:programlisting"/>
+              <xs:element ref="docbook:synopsis"/>
+              <xs:element ref="docbook:bridgehead"/>
+              <xs:element ref="docbook:remark"/>
+              <xs:element ref="docbook:revhistory"/>
+              <xs:element ref="docbook:indexterm"/>
+              <xs:element ref="docbook:funcsynopsis"/>
+              <xs:element ref="docbook:classsynopsis"/>
+              <xs:element ref="docbook:methodsynopsis"/>
+              <xs:element ref="docbook:constructorsynopsis"/>
+              <xs:element ref="docbook:destructorsynopsis"/>
+              <xs:element ref="docbook:fieldsynopsis"/>
+              <xs:element ref="docbook:cmdsynopsis"/>
+              <xs:element ref="docbook:caution"/>
+              <xs:element ref="docbook:important"/>
+              <xs:element ref="docbook:note"/>
+              <xs:element ref="docbook:tip"/>
+              <xs:element ref="docbook:warning"/>
+              <xs:element ref="docbook:anchor"/>
+              <xs:element ref="docbook:para"/>
+              <xs:element ref="docbook:formalpara"/>
+              <xs:element ref="docbook:simpara"/>
+              <xs:element ref="docbook:annotation"/>
+            </xs:choice>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:refsect3"/>
+          </xs:sequence>
+          <xs:element maxOccurs="unbounded" ref="docbook:refsect3"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="refsect3">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glosslist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence minOccurs="0">
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:glossentry"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glossentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element minOccurs="0" ref="docbook:acronym"/>
+        <xs:element minOccurs="0" ref="docbook:abbrev"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexterm"/>
+        <xs:choice>
+          <xs:element ref="docbook:glosssee"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:glossdef"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="sortas"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glossdef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:glossseealso"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="subject"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glosssee">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="otherterm" type="xs:IDREF"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glossseealso">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="otherterm" type="xs:IDREF"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="firstterm">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="baseform"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glossterm">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="baseform"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glossary">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:glossdiv"/>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:glossentry"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:bibliography"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="glossdiv">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:glossentry"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="termdef">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attribute name="sortas"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="baseform"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="biblioentry">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:abstract"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:artpagenums"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:authorgroup"/>
+        <xs:element ref="docbook:authorinitials"/>
+        <xs:element ref="docbook:bibliocoverage"/>
+        <xs:element ref="docbook:biblioid"/>
+        <xs:element ref="docbook:bibliosource"/>
+        <xs:element ref="docbook:collab"/>
+        <xs:element ref="docbook:confgroup"/>
+        <xs:element ref="docbook:contractsponsor"/>
+        <xs:element ref="docbook:contractnum"/>
+        <xs:element ref="docbook:copyright"/>
+        <xs:element ref="docbook:cover"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:edition"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:issuenum"/>
+        <xs:element ref="docbook:keywordset"/>
+        <xs:element ref="docbook:legalnotice"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:othercredit"/>
+        <xs:element ref="docbook:pagenums"/>
+        <xs:element ref="docbook:printhistory"/>
+        <xs:element ref="docbook:pubdate"/>
+        <xs:element ref="docbook:publisher"/>
+        <xs:element ref="docbook:publishername"/>
+        <xs:element ref="docbook:releaseinfo"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:seriesvolnums"/>
+        <xs:element ref="docbook:subjectset"/>
+        <xs:element ref="docbook:volumenum"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:extendedlink"/>
+        <xs:element ref="docbook:bibliomisc"/>
+        <xs:element ref="docbook:bibliomset"/>
+        <xs:element ref="docbook:bibliorelation"/>
+        <xs:element ref="docbook:biblioset"/>
+        <xs:element ref="docbook:itermset"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personblurb"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:subtitle"/>
+        <xs:element ref="docbook:title"/>
+        <xs:element ref="docbook:titleabbrev"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliomixed">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:abstract"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:artpagenums"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:authorgroup"/>
+        <xs:element ref="docbook:authorinitials"/>
+        <xs:element ref="docbook:bibliocoverage"/>
+        <xs:element ref="docbook:biblioid"/>
+        <xs:element ref="docbook:bibliosource"/>
+        <xs:element ref="docbook:collab"/>
+        <xs:element ref="docbook:confgroup"/>
+        <xs:element ref="docbook:contractsponsor"/>
+        <xs:element ref="docbook:contractnum"/>
+        <xs:element ref="docbook:copyright"/>
+        <xs:element ref="docbook:cover"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:edition"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:issuenum"/>
+        <xs:element ref="docbook:keywordset"/>
+        <xs:element ref="docbook:legalnotice"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:othercredit"/>
+        <xs:element ref="docbook:pagenums"/>
+        <xs:element ref="docbook:printhistory"/>
+        <xs:element ref="docbook:pubdate"/>
+        <xs:element ref="docbook:publisher"/>
+        <xs:element ref="docbook:publishername"/>
+        <xs:element ref="docbook:releaseinfo"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:seriesvolnums"/>
+        <xs:element ref="docbook:subjectset"/>
+        <xs:element ref="docbook:volumenum"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:extendedlink"/>
+        <xs:element ref="docbook:bibliomisc"/>
+        <xs:element ref="docbook:bibliomset"/>
+        <xs:element ref="docbook:bibliorelation"/>
+        <xs:element ref="docbook:biblioset"/>
+        <xs:element ref="docbook:itermset"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personblurb"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:subtitle"/>
+        <xs:element ref="docbook:title"/>
+        <xs:element ref="docbook:titleabbrev"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="biblioset">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:abstract"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:artpagenums"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:authorgroup"/>
+        <xs:element ref="docbook:authorinitials"/>
+        <xs:element ref="docbook:bibliocoverage"/>
+        <xs:element ref="docbook:biblioid"/>
+        <xs:element ref="docbook:bibliosource"/>
+        <xs:element ref="docbook:collab"/>
+        <xs:element ref="docbook:confgroup"/>
+        <xs:element ref="docbook:contractsponsor"/>
+        <xs:element ref="docbook:contractnum"/>
+        <xs:element ref="docbook:copyright"/>
+        <xs:element ref="docbook:cover"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:edition"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:issuenum"/>
+        <xs:element ref="docbook:keywordset"/>
+        <xs:element ref="docbook:legalnotice"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:othercredit"/>
+        <xs:element ref="docbook:pagenums"/>
+        <xs:element ref="docbook:printhistory"/>
+        <xs:element ref="docbook:pubdate"/>
+        <xs:element ref="docbook:publisher"/>
+        <xs:element ref="docbook:publishername"/>
+        <xs:element ref="docbook:releaseinfo"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:seriesvolnums"/>
+        <xs:element ref="docbook:subjectset"/>
+        <xs:element ref="docbook:volumenum"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:extendedlink"/>
+        <xs:element ref="docbook:bibliomisc"/>
+        <xs:element ref="docbook:bibliomset"/>
+        <xs:element ref="docbook:bibliorelation"/>
+        <xs:element ref="docbook:biblioset"/>
+        <xs:element ref="docbook:itermset"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personblurb"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:subtitle"/>
+        <xs:element ref="docbook:title"/>
+        <xs:element ref="docbook:titleabbrev"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="relation"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliomset">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:abstract"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:artpagenums"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:authorgroup"/>
+        <xs:element ref="docbook:authorinitials"/>
+        <xs:element ref="docbook:bibliocoverage"/>
+        <xs:element ref="docbook:biblioid"/>
+        <xs:element ref="docbook:bibliosource"/>
+        <xs:element ref="docbook:collab"/>
+        <xs:element ref="docbook:confgroup"/>
+        <xs:element ref="docbook:contractsponsor"/>
+        <xs:element ref="docbook:contractnum"/>
+        <xs:element ref="docbook:copyright"/>
+        <xs:element ref="docbook:cover"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:edition"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:issuenum"/>
+        <xs:element ref="docbook:keywordset"/>
+        <xs:element ref="docbook:legalnotice"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:othercredit"/>
+        <xs:element ref="docbook:pagenums"/>
+        <xs:element ref="docbook:printhistory"/>
+        <xs:element ref="docbook:pubdate"/>
+        <xs:element ref="docbook:publisher"/>
+        <xs:element ref="docbook:publishername"/>
+        <xs:element ref="docbook:releaseinfo"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:seriesvolnums"/>
+        <xs:element ref="docbook:subjectset"/>
+        <xs:element ref="docbook:volumenum"/>
+        <xs:element ref="docbook:extendedlink"/>
+        <xs:element ref="docbook:bibliomisc"/>
+        <xs:element ref="docbook:bibliomset"/>
+        <xs:element ref="docbook:bibliorelation"/>
+        <xs:element ref="docbook:biblioset"/>
+        <xs:element ref="docbook:itermset"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personblurb"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:subtitle"/>
+        <xs:element ref="docbook:title"/>
+        <xs:element ref="docbook:titleabbrev"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="relation"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliomisc">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliography">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:bibliodiv"/>
+          <xs:choice maxOccurs="unbounded">
+            <xs:element ref="docbook:biblioentry"/>
+            <xs:element ref="docbook:bibliomixed"/>
+          </xs:choice>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliodiv">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:biblioentry"/>
+          <xs:element ref="docbook:bibliomixed"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bibliolist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence minOccurs="0">
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:biblioentry"/>
+          <xs:element ref="docbook:bibliomixed"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="biblioref">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="xrefstyle"/>
+      <xs:attribute name="endterm" type="xs:IDREF"/>
+      <xs:attribute name="units" type="xs:NMTOKEN"/>
+      <xs:attribute name="begin" type="xs:NMTOKEN"/>
+      <xs:attribute name="end" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="itermset">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:indexterm"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="indexterm">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:primary"/>
+        <xs:choice minOccurs="0">
+          <xs:sequence>
+            <xs:element ref="docbook:secondary"/>
+            <xs:choice minOccurs="0">
+              <xs:sequence>
+                <xs:element ref="docbook:tertiary"/>
+                <xs:choice minOccurs="0">
+                  <xs:element ref="docbook:see"/>
+                  <xs:element maxOccurs="unbounded" ref="docbook:seealso"/>
+                </xs:choice>
+              </xs:sequence>
+              <xs:element ref="docbook:see"/>
+              <xs:element maxOccurs="unbounded" ref="docbook:seealso"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:element ref="docbook:see"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:seealso"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="significance">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="normal"/>
+            <xs:enumeration value="preferred"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startref" type="xs:IDREF"/>
+      <xs:attribute name="zone" type="xs:IDREFS"/>
+      <xs:attribute name="pagenum"/>
+      <xs:attribute name="scope">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="all"/>
+            <xs:enumeration value="global"/>
+            <xs:enumeration value="local"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="type"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="singular"/>
+            <xs:enumeration value="startofrange"/>
+            <xs:enumeration value="endofrange"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="primary">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="sortas"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="secondary">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="sortas"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tertiary">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="sortas"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="see">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="seealso">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="index">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexdiv"/>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexentry"/>
+          <xs:element ref="docbook:segmentedlist"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+      <xs:attribute name="type"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="setindex">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexdiv"/>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexentry"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+      <xs:attribute name="type"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="indexdiv">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:indexentry"/>
+          <xs:element ref="docbook:segmentedlist"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="status"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="indexentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:primaryie"/>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:seeie"/>
+          <xs:element ref="docbook:seealsoie"/>
+        </xs:choice>
+        <xs:sequence minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:secondaryie"/>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:seeie"/>
+            <xs:element ref="docbook:seealsoie"/>
+            <xs:element ref="docbook:tertiaryie"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="primaryie">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="linkends" type="xs:IDREFS"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="secondaryie">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="linkends" type="xs:IDREFS"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tertiaryie">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="linkends" type="xs:IDREFS"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="seeie">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="seealsoie">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="linkends" type="xs:IDREFS"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="toc">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:tocdiv"/>
+          <xs:element ref="docbook:tocentry"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tocdiv">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:tocdiv"/>
+          <xs:element ref="docbook:tocentry"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="pagenum"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tocentry">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="pagenum"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="task">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+            <xs:element ref="docbook:subtitle"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:tasksummary"/>
+        <xs:element minOccurs="0" ref="docbook:taskprerequisites"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:example"/>
+        <xs:element minOccurs="0" ref="docbook:taskrelated"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tasksummary">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="taskprerequisites">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="taskrelated">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="calloutlist">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:callout"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="callout">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+        <xs:element ref="docbook:annotation"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="arearefs" use="required" type="xs:IDREFS"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="programlistingco">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element ref="docbook:areaspec"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:calloutlist"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="areaspec">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:area"/>
+        <xs:element ref="docbook:areaset"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="units">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="calspair"/>
+            <xs:enumeration value="linecolumn"/>
+            <xs:enumeration value="linecolumnpair"/>
+            <xs:enumeration value="linerange"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherunits" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="area">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:alt"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="units">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="calspair"/>
+            <xs:enumeration value="linecolumn"/>
+            <xs:enumeration value="linecolumnpair"/>
+            <xs:enumeration value="linerange"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherunits" type="xs:NMTOKEN"/>
+      <xs:attribute name="linkends" type="xs:IDREFS"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="coords" use="required"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="areaset">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:area"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="units">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="calspair"/>
+            <xs:enumeration value="linecolumn"/>
+            <xs:enumeration value="linecolumnpair"/>
+            <xs:enumeration value="linerange"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherunits" type="xs:NMTOKEN"/>
+      <xs:attribute name="linkends" type="xs:IDREFS"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="screenco">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element ref="docbook:areaspec"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:calloutlist"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="imageobjectco">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element ref="docbook:areaspec"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:imageobject"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:calloutlist"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="co">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="linkends" type="xs:IDREFS"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="coref">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="productionset">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:production"/>
+          <xs:element ref="docbook:productionrecap"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="production">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:lhs"/>
+        <xs:element ref="docbook:rhs"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:constraint"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="lhs">
+    <xs:complexType mixed="true">
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="rhs">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:lineannotation"/>
+        <xs:element ref="docbook:sbr"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="nonterminal">
+    <xs:complexType mixed="true">
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="def" use="required"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="constraint">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="productionrecap">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="constraintdef">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tgroup">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:colspec"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:spanspec"/>
+        <xs:element minOccurs="0" ref="docbook:thead"/>
+        <xs:element minOccurs="0" ref="docbook:tfoot"/>
+        <xs:element ref="docbook:tbody"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="tgroupstyle"/>
+      <xs:attribute name="cols" use="required" type="xs:NMTOKEN"/>
+      <xs:attribute name="colsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="right"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="colspec">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="colnum" type="xs:NMTOKEN"/>
+      <xs:attribute name="char"/>
+      <xs:attribute name="colsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="colwidth"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="colname"/>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="right"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="spanspec">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="spanname" use="required"/>
+      <xs:attribute name="namest" use="required"/>
+      <xs:attribute name="nameend" use="required"/>
+      <xs:attribute name="char"/>
+      <xs:attribute name="colsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="right"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="thead">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:colspec"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:row"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:tr"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tfoot">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:colspec"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:row"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:tr"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tbody">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element maxOccurs="unbounded" ref="docbook:row"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:tr"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="row">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:entry"/>
+        <xs:element ref="docbook:entrytbl"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="top"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="entry">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="top"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="colsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="morerows" type="xs:NMTOKEN"/>
+      <xs:attribute name="colname"/>
+      <xs:attribute name="namest"/>
+      <xs:attribute name="spanname"/>
+      <xs:attribute name="nameend"/>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rotate">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="right"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="entrytbl">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:colspec"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:spanspec"/>
+        <xs:element minOccurs="0" ref="docbook:thead"/>
+        <xs:element ref="docbook:tbody"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="colname"/>
+      <xs:attribute name="namest"/>
+      <xs:attribute name="spanname"/>
+      <xs:attribute name="nameend"/>
+      <xs:attribute name="tgroupstyle"/>
+      <xs:attribute name="cols" type="xs:NMTOKEN"/>
+      <xs:attribute name="colsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="right"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="table">
+    <xs:complexType>
+      <xs:choice>
+        <xs:sequence>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+          <xs:sequence>
+            <xs:element ref="docbook:title"/>
+            <xs:element minOccurs="0" ref="docbook:titleabbrev"/>
+          </xs:sequence>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:indexterm"/>
+          <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:textobject"/>
+          <xs:choice>
+            <xs:element maxOccurs="unbounded" ref="docbook:mediaobject"/>
+            <xs:element maxOccurs="unbounded" ref="docbook:tgroup"/>
+          </xs:choice>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:element ref="docbook:caption"/>
+          <xs:choice>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:col"/>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:colgroup"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:thead"/>
+          <xs:element minOccurs="0" ref="docbook:tfoot"/>
+          <xs:choice>
+            <xs:element maxOccurs="unbounded" ref="docbook:tbody"/>
+            <xs:element maxOccurs="unbounded" ref="docbook:tr"/>
+          </xs:choice>
+        </xs:sequence>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attribute name="label"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="tabstyle"/>
+      <xs:attribute name="floatstyle"/>
+      <xs:attribute name="orient">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="land"/>
+            <xs:enumeration value="port"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="colsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="frame">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="all"/>
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="none"/>
+            <xs:enumeration value="sides"/>
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="topbot"/>
+            <xs:enumeration value="void"/>
+            <xs:enumeration value="above"/>
+            <xs:enumeration value="below"/>
+            <xs:enumeration value="hsides"/>
+            <xs:enumeration value="lhs"/>
+            <xs:enumeration value="rhs"/>
+            <xs:enumeration value="vsides"/>
+            <xs:enumeration value="box"/>
+            <xs:enumeration value="border"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="pgwide">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="shortentry">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="tocentry">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowheader">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="firstcol"/>
+            <xs:enumeration value="norowheader"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="summary"/>
+      <xs:attribute name="width"/>
+      <xs:attribute name="border" type="xs:NMTOKEN"/>
+      <xs:attribute name="rules">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="none"/>
+            <xs:enumeration value="groups"/>
+            <xs:enumeration value="rows"/>
+            <xs:enumeration value="cols"/>
+            <xs:enumeration value="all"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="cellspacing"/>
+      <xs:attribute name="cellpadding"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="informaltable">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:choice>
+          <xs:sequence>
+            <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:textobject"/>
+            <xs:choice>
+              <xs:element maxOccurs="unbounded" ref="docbook:mediaobject"/>
+              <xs:element maxOccurs="unbounded" ref="docbook:tgroup"/>
+            </xs:choice>
+          </xs:sequence>
+          <xs:sequence>
+            <xs:choice>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:col"/>
+              <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:colgroup"/>
+            </xs:choice>
+            <xs:element minOccurs="0" ref="docbook:thead"/>
+            <xs:element minOccurs="0" ref="docbook:tfoot"/>
+            <xs:choice>
+              <xs:element maxOccurs="unbounded" ref="docbook:tbody"/>
+              <xs:element maxOccurs="unbounded" ref="docbook:tr"/>
+            </xs:choice>
+          </xs:sequence>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="tabstyle"/>
+      <xs:attribute name="floatstyle"/>
+      <xs:attribute name="orient">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="land"/>
+            <xs:enumeration value="port"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="colsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowsep">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="frame">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="all"/>
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="none"/>
+            <xs:enumeration value="sides"/>
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="topbot"/>
+            <xs:enumeration value="void"/>
+            <xs:enumeration value="above"/>
+            <xs:enumeration value="below"/>
+            <xs:enumeration value="hsides"/>
+            <xs:enumeration value="lhs"/>
+            <xs:enumeration value="rhs"/>
+            <xs:enumeration value="vsides"/>
+            <xs:enumeration value="box"/>
+            <xs:enumeration value="border"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="pgwide">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowheader">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="firstcol"/>
+            <xs:enumeration value="norowheader"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="summary"/>
+      <xs:attribute name="width"/>
+      <xs:attribute name="border" type="xs:NMTOKEN"/>
+      <xs:attribute name="rules">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="none"/>
+            <xs:enumeration value="groups"/>
+            <xs:enumeration value="rows"/>
+            <xs:enumeration value="cols"/>
+            <xs:enumeration value="all"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="cellspacing"/>
+      <xs:attribute name="cellpadding"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="col">
+    <xs:complexType>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="span" type="xs:NMTOKEN"/>
+      <xs:attribute name="width"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="colgroup">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:col"/>
+      </xs:sequence>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="span" type="xs:NMTOKEN"/>
+      <xs:attribute name="width"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tr">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:th"/>
+        <xs:element ref="docbook:td"/>
+      </xs:choice>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="th">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+      </xs:choice>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="abbr"/>
+      <xs:attribute name="axis"/>
+      <xs:attribute name="headers"/>
+      <xs:attribute name="scope">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="row"/>
+            <xs:enumeration value="col"/>
+            <xs:enumeration value="rowgroup"/>
+            <xs:enumeration value="colgroup"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowspan" type="xs:NMTOKEN"/>
+      <xs:attribute name="colspan" type="xs:NMTOKEN"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="td">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+      </xs:choice>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attribute name="class"/>
+      <xs:attribute name="style"/>
+      <xs:attribute name="title"/>
+      <xs:attribute name="lang"/>
+      <xs:attribute name="onclick"/>
+      <xs:attribute name="ondblclick"/>
+      <xs:attribute name="onmousedown"/>
+      <xs:attribute name="onmouseup"/>
+      <xs:attribute name="onmouseover"/>
+      <xs:attribute name="onmousemove"/>
+      <xs:attribute name="onmouseout"/>
+      <xs:attribute name="onkeypress"/>
+      <xs:attribute name="onkeydown"/>
+      <xs:attribute name="onkeyup"/>
+      <xs:attribute name="abbr"/>
+      <xs:attribute name="axis"/>
+      <xs:attribute name="headers"/>
+      <xs:attribute name="scope">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="row"/>
+            <xs:enumeration value="col"/>
+            <xs:enumeration value="rowgroup"/>
+            <xs:enumeration value="colgroup"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="rowspan" type="xs:NMTOKEN"/>
+      <xs:attribute name="colspan" type="xs:NMTOKEN"/>
+      <xs:attribute name="align">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="center"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="justify"/>
+            <xs:enumeration value="char"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="char"/>
+      <xs:attribute name="charoff"/>
+      <xs:attribute name="valign">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="top"/>
+            <xs:enumeration value="middle"/>
+            <xs:enumeration value="bottom"/>
+            <xs:enumeration value="baseline"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgset">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:msgentry"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:simplemsgentry"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="docbook:msg"/>
+        <xs:element minOccurs="0" ref="docbook:msginfo"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:msgexplan"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="simplemsgentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="docbook:msgtext"/>
+        <xs:element maxOccurs="unbounded" ref="docbook:msgexplan"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="msgaud"/>
+      <xs:attribute name="msgorig"/>
+      <xs:attribute name="msglevel"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msg">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element ref="docbook:msgmain"/>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:msgsub"/>
+          <xs:element ref="docbook:msgrel"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgmain">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element ref="docbook:msgtext"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgsub">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element ref="docbook:msgtext"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgrel">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element ref="docbook:msgtext"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgtext">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:itemizedlist"/>
+        <xs:element ref="docbook:orderedlist"/>
+        <xs:element ref="docbook:procedure"/>
+        <xs:element ref="docbook:simplelist"/>
+        <xs:element ref="docbook:variablelist"/>
+        <xs:element ref="docbook:segmentedlist"/>
+        <xs:element ref="docbook:glosslist"/>
+        <xs:element ref="docbook:bibliolist"/>
+        <xs:element ref="docbook:calloutlist"/>
+        <xs:element ref="docbook:qandaset"/>
+        <xs:element ref="docbook:example"/>
+        <xs:element ref="docbook:figure"/>
+        <xs:element ref="docbook:table"/>
+        <xs:element ref="docbook:equation"/>
+        <xs:element ref="docbook:informalexample"/>
+        <xs:element ref="docbook:informalfigure"/>
+        <xs:element ref="docbook:informaltable"/>
+        <xs:element ref="docbook:informalequation"/>
+        <xs:element ref="docbook:sidebar"/>
+        <xs:element ref="docbook:blockquote"/>
+        <xs:element ref="docbook:address"/>
+        <xs:element ref="docbook:epigraph"/>
+        <xs:element ref="docbook:mediaobject"/>
+        <xs:element ref="docbook:screenshot"/>
+        <xs:element ref="docbook:task"/>
+        <xs:element ref="docbook:productionset"/>
+        <xs:element ref="docbook:constraintdef"/>
+        <xs:element ref="docbook:msgset"/>
+        <xs:element ref="docbook:screen"/>
+        <xs:element ref="docbook:literallayout"/>
+        <xs:element ref="docbook:programlistingco"/>
+        <xs:element ref="docbook:screenco"/>
+        <xs:element ref="docbook:programlisting"/>
+        <xs:element ref="docbook:synopsis"/>
+        <xs:element ref="docbook:bridgehead"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:revhistory"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:funcsynopsis"/>
+        <xs:element ref="docbook:classsynopsis"/>
+        <xs:element ref="docbook:methodsynopsis"/>
+        <xs:element ref="docbook:constructorsynopsis"/>
+        <xs:element ref="docbook:destructorsynopsis"/>
+        <xs:element ref="docbook:fieldsynopsis"/>
+        <xs:element ref="docbook:cmdsynopsis"/>
+        <xs:element ref="docbook:caution"/>
+        <xs:element ref="docbook:important"/>
+        <xs:element ref="docbook:note"/>
+        <xs:element ref="docbook:tip"/>
+        <xs:element ref="docbook:warning"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:para"/>
+        <xs:element ref="docbook:formalpara"/>
+        <xs:element ref="docbook:simpara"/>
+        <xs:element ref="docbook:annotation"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msginfo">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:msglevel"/>
+        <xs:element ref="docbook:msgorig"/>
+        <xs:element ref="docbook:msgaud"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msglevel">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgorig">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgaud">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="msgexplan">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="qandaset">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:qandadiv"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:qandaentry"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="defaultlabel">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="none"/>
+            <xs:enumeration value="number"/>
+            <xs:enumeration value="qanda"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="qandadiv">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:qandadiv"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:qandaentry"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="qandaentry">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element ref="docbook:question"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:answer"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="question">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:label"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="answer">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:label"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="label">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="equation">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:alt"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:mediaobject"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:mathphrase"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:caption"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="label"/>
+      <xs:attribute name="pgwide">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="0"/>
+            <xs:enumeration value="1"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="floatstyle"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="informalequation">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:element minOccurs="0" ref="docbook:alt"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:mediaobject"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:mathphrase"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="docbook:caption"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="inlineequation">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:alt"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:inlinemediaobject"/>
+          <xs:element maxOccurs="unbounded" ref="docbook:mathphrase"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="mathphrase">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:emphasis"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="markup">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tag">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="attribute"/>
+            <xs:enumeration value="attvalue"/>
+            <xs:enumeration value="element"/>
+            <xs:enumeration value="emptytag"/>
+            <xs:enumeration value="endtag"/>
+            <xs:enumeration value="genentity"/>
+            <xs:enumeration value="localname"/>
+            <xs:enumeration value="namespace"/>
+            <xs:enumeration value="numcharref"/>
+            <xs:enumeration value="paramentity"/>
+            <xs:enumeration value="pi"/>
+            <xs:enumeration value="prefix"/>
+            <xs:enumeration value="comment"/>
+            <xs:enumeration value="starttag"/>
+            <xs:enumeration value="xmlpi"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="namespace"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="symbol">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="limit"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="token">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="literal">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="code">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="language"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="constant">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="limit"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="productname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="copyright"/>
+            <xs:enumeration value="registered"/>
+            <xs:enumeration value="service"/>
+            <xs:enumeration value="trade"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="productnumber">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="database">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="altkey"/>
+            <xs:enumeration value="constraint"/>
+            <xs:enumeration value="datatype"/>
+            <xs:enumeration value="field"/>
+            <xs:enumeration value="foreignkey"/>
+            <xs:enumeration value="group"/>
+            <xs:enumeration value="index"/>
+            <xs:enumeration value="key1"/>
+            <xs:enumeration value="key2"/>
+            <xs:enumeration value="name"/>
+            <xs:enumeration value="primarykey"/>
+            <xs:enumeration value="procedure"/>
+            <xs:enumeration value="record"/>
+            <xs:enumeration value="rule"/>
+            <xs:enumeration value="secondarykey"/>
+            <xs:enumeration value="table"/>
+            <xs:enumeration value="user"/>
+            <xs:enumeration value="view"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="application">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="hardware"/>
+            <xs:enumeration value="software"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="hardware">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="guibutton">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:accel"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="guiicon">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:accel"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="guilabel">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:accel"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="guimenu">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:accel"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="guimenuitem">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:accel"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="guisubmenu">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:accel"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="menuchoice">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:shortcut"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:guibutton"/>
+          <xs:element ref="docbook:guiicon"/>
+          <xs:element ref="docbook:guilabel"/>
+          <xs:element ref="docbook:guimenu"/>
+          <xs:element ref="docbook:guimenuitem"/>
+          <xs:element ref="docbook:guisubmenu"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="mousebutton">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="keycap">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="function">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="alt"/>
+            <xs:enumeration value="backspace"/>
+            <xs:enumeration value="command"/>
+            <xs:enumeration value="control"/>
+            <xs:enumeration value="delete"/>
+            <xs:enumeration value="down"/>
+            <xs:enumeration value="end"/>
+            <xs:enumeration value="enter"/>
+            <xs:enumeration value="escape"/>
+            <xs:enumeration value="home"/>
+            <xs:enumeration value="insert"/>
+            <xs:enumeration value="left"/>
+            <xs:enumeration value="meta"/>
+            <xs:enumeration value="option"/>
+            <xs:enumeration value="pagedown"/>
+            <xs:enumeration value="pageup"/>
+            <xs:enumeration value="right"/>
+            <xs:enumeration value="shift"/>
+            <xs:enumeration value="space"/>
+            <xs:enumeration value="tab"/>
+            <xs:enumeration value="up"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otherfunction"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="keycode">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="keycombo">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:mousebutton"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="action">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="click"/>
+            <xs:enumeration value="double-click"/>
+            <xs:enumeration value="press"/>
+            <xs:enumeration value="seq"/>
+            <xs:enumeration value="simul"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otheraction"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="keysym">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="accel">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="shortcut">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:mousebutton"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="action">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="click"/>
+            <xs:enumeration value="double-click"/>
+            <xs:enumeration value="press"/>
+            <xs:enumeration value="seq"/>
+            <xs:enumeration value="simul"/>
+            <xs:enumeration value="other"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="otheraction"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="prompt">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="envar">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="filename">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="path"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="devicefile"/>
+            <xs:enumeration value="directory"/>
+            <xs:enumeration value="extension"/>
+            <xs:enumeration value="headerfile"/>
+            <xs:enumeration value="libraryfile"/>
+            <xs:enumeration value="partition"/>
+            <xs:enumeration value="symlink"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="command">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="computeroutput">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:co"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="userinput">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:co"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="cmdsynopsis">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:command"/>
+          <xs:element ref="docbook:arg"/>
+          <xs:element ref="docbook:group"/>
+          <xs:element ref="docbook:sbr"/>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:synopfragment"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="sepchar"/>
+      <xs:attribute name="cmdlength"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="arg">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:arg"/>
+        <xs:element ref="docbook:group"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:synopfragmentref"/>
+        <xs:element ref="docbook:sbr"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="rep" default="norepeat">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="norepeat"/>
+            <xs:enumeration value="repeat"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="choice" default="opt">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="opt"/>
+            <xs:enumeration value="plain"/>
+            <xs:enumeration value="req"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:arg"/>
+        <xs:element ref="docbook:group"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:synopfragmentref"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:sbr"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="rep" default="norepeat">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="norepeat"/>
+            <xs:enumeration value="repeat"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="choice" default="opt">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="opt"/>
+            <xs:enumeration value="plain"/>
+            <xs:enumeration value="req"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sbr">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="synopfragment">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:element ref="docbook:arg"/>
+        <xs:element ref="docbook:group"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="synopfragmentref">
+    <xs:complexType mixed="true">
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="synopsis">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:textobject"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:lineannotation"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="linenumbering">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="numbered"/>
+            <xs:enumeration value="unnumbered"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startinglinenumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="language"/>
+      <xs:attribute ref="xml:space"/>
+      <xs:attribute name="label"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="funcsynopsis">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" ref="docbook:info"/>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:funcsynopsisinfo"/>
+          <xs:element ref="docbook:funcprototype"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="language"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="funcsynopsisinfo">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:textobject"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:lineannotation"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="linenumbering">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="numbered"/>
+            <xs:enumeration value="unnumbered"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startinglinenumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="language"/>
+      <xs:attribute ref="xml:space"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="funcprototype">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+        <xs:element ref="docbook:funcdef"/>
+        <xs:choice>
+          <xs:element ref="docbook:void"/>
+          <xs:element ref="docbook:varargs"/>
+          <xs:sequence>
+            <xs:element maxOccurs="unbounded" ref="docbook:paramdef"/>
+            <xs:element minOccurs="0" ref="docbook:varargs"/>
+          </xs:sequence>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="funcdef">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:function"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="function">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="void">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="varargs">
+    <xs:complexType>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="paramdef">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:funcparams"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="choice" default="opt">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="opt"/>
+            <xs:enumeration value="req"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="funcparams">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="classsynopsis">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:ooclass"/>
+          <xs:element ref="docbook:ooexception"/>
+          <xs:element ref="docbook:oointerface"/>
+        </xs:choice>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:classsynopsisinfo"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="language"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="class"/>
+            <xs:enumeration value="interface"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="classsynopsisinfo">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:textobject"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:lineannotation"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="linenumbering">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="numbered"/>
+            <xs:enumeration value="unnumbered"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startinglinenumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="language"/>
+      <xs:attribute ref="xml:space"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ooclass">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:package"/>
+          <xs:element ref="docbook:modifier"/>
+        </xs:choice>
+        <xs:element ref="docbook:classname"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="oointerface">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:package"/>
+          <xs:element ref="docbook:modifier"/>
+        </xs:choice>
+        <xs:element ref="docbook:interfacename"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="ooexception">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:package"/>
+          <xs:element ref="docbook:modifier"/>
+        </xs:choice>
+        <xs:element ref="docbook:exceptionname"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="modifier">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute ref="xml:space"/>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="interfacename">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="exceptionname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="fieldsynopsis">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+        <xs:element minOccurs="0" ref="docbook:type"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element minOccurs="0" ref="docbook:initializer"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="language"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="initializer">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="constructorsynopsis">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+        <xs:element minOccurs="0" ref="docbook:methodname"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:methodparam"/>
+          <xs:element minOccurs="0" ref="docbook:void"/>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:exceptionname"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="language"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="destructorsynopsis">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+        <xs:element minOccurs="0" ref="docbook:methodname"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:methodparam"/>
+          <xs:element minOccurs="0" ref="docbook:void"/>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:exceptionname"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="language"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="methodsynopsis">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+        <xs:choice minOccurs="0">
+          <xs:element ref="docbook:type"/>
+          <xs:element ref="docbook:void"/>
+        </xs:choice>
+        <xs:element ref="docbook:methodname"/>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="docbook:methodparam"/>
+          <xs:element ref="docbook:void"/>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:exceptionname"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="language"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="methodname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="methodparam">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+          <xs:element ref="docbook:modifier"/>
+          <xs:element ref="docbook:type"/>
+        </xs:choice>
+        <xs:choice>
+          <xs:sequence>
+            <xs:element ref="docbook:parameter"/>
+            <xs:element minOccurs="0" ref="docbook:initializer"/>
+          </xs:sequence>
+          <xs:element ref="docbook:funcparams"/>
+        </xs:choice>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="docbook:modifier"/>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="rep" default="norepeat">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="norepeat"/>
+            <xs:enumeration value="repeat"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="choice" default="req">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="opt"/>
+            <xs:enumeration value="plain"/>
+            <xs:enumeration value="req"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="varname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="returnvalue">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="type">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="classname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="programlisting">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:info"/>
+        <xs:element ref="docbook:textobject"/>
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:abbrev"/>
+        <xs:element ref="docbook:acronym"/>
+        <xs:element ref="docbook:date"/>
+        <xs:element ref="docbook:emphasis"/>
+        <xs:element ref="docbook:footnote"/>
+        <xs:element ref="docbook:footnoteref"/>
+        <xs:element ref="docbook:foreignphrase"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:quote"/>
+        <xs:element ref="docbook:wordasword"/>
+        <xs:element ref="docbook:firstterm"/>
+        <xs:element ref="docbook:glossterm"/>
+        <xs:element ref="docbook:coref"/>
+        <xs:element ref="docbook:trademark"/>
+        <xs:element ref="docbook:productnumber"/>
+        <xs:element ref="docbook:productname"/>
+        <xs:element ref="docbook:database"/>
+        <xs:element ref="docbook:application"/>
+        <xs:element ref="docbook:hardware"/>
+        <xs:element ref="docbook:citation"/>
+        <xs:element ref="docbook:citerefentry"/>
+        <xs:element ref="docbook:citetitle"/>
+        <xs:element ref="docbook:citebiblioid"/>
+        <xs:element ref="docbook:author"/>
+        <xs:element ref="docbook:person"/>
+        <xs:element ref="docbook:personname"/>
+        <xs:element ref="docbook:org"/>
+        <xs:element ref="docbook:orgname"/>
+        <xs:element ref="docbook:editor"/>
+        <xs:element ref="docbook:jobtitle"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:package"/>
+        <xs:element ref="docbook:parameter"/>
+        <xs:element ref="docbook:termdef"/>
+        <xs:element ref="docbook:nonterminal"/>
+        <xs:element ref="docbook:systemitem"/>
+        <xs:element ref="docbook:option"/>
+        <xs:element ref="docbook:optional"/>
+        <xs:element ref="docbook:property"/>
+        <xs:element ref="docbook:inlineequation"/>
+        <xs:element ref="docbook:tag"/>
+        <xs:element ref="docbook:markup"/>
+        <xs:element ref="docbook:token"/>
+        <xs:element ref="docbook:symbol"/>
+        <xs:element ref="docbook:literal"/>
+        <xs:element ref="docbook:code"/>
+        <xs:element ref="docbook:constant"/>
+        <xs:element ref="docbook:email"/>
+        <xs:element ref="docbook:uri"/>
+        <xs:element ref="docbook:guiicon"/>
+        <xs:element ref="docbook:guibutton"/>
+        <xs:element ref="docbook:guimenuitem"/>
+        <xs:element ref="docbook:guimenu"/>
+        <xs:element ref="docbook:guisubmenu"/>
+        <xs:element ref="docbook:guilabel"/>
+        <xs:element ref="docbook:menuchoice"/>
+        <xs:element ref="docbook:mousebutton"/>
+        <xs:element ref="docbook:keycombo"/>
+        <xs:element ref="docbook:keycap"/>
+        <xs:element ref="docbook:keycode"/>
+        <xs:element ref="docbook:keysym"/>
+        <xs:element ref="docbook:shortcut"/>
+        <xs:element ref="docbook:accel"/>
+        <xs:element ref="docbook:prompt"/>
+        <xs:element ref="docbook:envar"/>
+        <xs:element ref="docbook:filename"/>
+        <xs:element ref="docbook:command"/>
+        <xs:element ref="docbook:computeroutput"/>
+        <xs:element ref="docbook:userinput"/>
+        <xs:element ref="docbook:function"/>
+        <xs:element ref="docbook:varname"/>
+        <xs:element ref="docbook:returnvalue"/>
+        <xs:element ref="docbook:type"/>
+        <xs:element ref="docbook:classname"/>
+        <xs:element ref="docbook:exceptionname"/>
+        <xs:element ref="docbook:interfacename"/>
+        <xs:element ref="docbook:methodname"/>
+        <xs:element ref="docbook:modifier"/>
+        <xs:element ref="docbook:initializer"/>
+        <xs:element ref="docbook:ooclass"/>
+        <xs:element ref="docbook:ooexception"/>
+        <xs:element ref="docbook:oointerface"/>
+        <xs:element ref="docbook:errorcode"/>
+        <xs:element ref="docbook:errortext"/>
+        <xs:element ref="docbook:errorname"/>
+        <xs:element ref="docbook:errortype"/>
+        <xs:element ref="docbook:lineannotation"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="continuation">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="continues"/>
+            <xs:enumeration value="restarts"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="linenumbering">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="numbered"/>
+            <xs:enumeration value="unnumbered"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+      <xs:attribute name="startinglinenumber" type="xs:NMTOKEN"/>
+      <xs:attribute name="language"/>
+      <xs:attribute ref="xml:space"/>
+      <xs:attribute name="width" type="xs:NMTOKEN"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="caution">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="important">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="note">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="tip">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="warning">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:sequence>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="docbook:title"/>
+            <xs:element ref="docbook:titleabbrev"/>
+          </xs:choice>
+          <xs:element minOccurs="0" ref="docbook:info"/>
+        </xs:sequence>
+        <xs:choice maxOccurs="unbounded">
+          <xs:element ref="docbook:itemizedlist"/>
+          <xs:element ref="docbook:orderedlist"/>
+          <xs:element ref="docbook:procedure"/>
+          <xs:element ref="docbook:simplelist"/>
+          <xs:element ref="docbook:variablelist"/>
+          <xs:element ref="docbook:segmentedlist"/>
+          <xs:element ref="docbook:glosslist"/>
+          <xs:element ref="docbook:bibliolist"/>
+          <xs:element ref="docbook:calloutlist"/>
+          <xs:element ref="docbook:qandaset"/>
+          <xs:element ref="docbook:example"/>
+          <xs:element ref="docbook:figure"/>
+          <xs:element ref="docbook:table"/>
+          <xs:element ref="docbook:equation"/>
+          <xs:element ref="docbook:informalexample"/>
+          <xs:element ref="docbook:informalfigure"/>
+          <xs:element ref="docbook:informaltable"/>
+          <xs:element ref="docbook:informalequation"/>
+          <xs:element ref="docbook:sidebar"/>
+          <xs:element ref="docbook:blockquote"/>
+          <xs:element ref="docbook:address"/>
+          <xs:element ref="docbook:epigraph"/>
+          <xs:element ref="docbook:mediaobject"/>
+          <xs:element ref="docbook:screenshot"/>
+          <xs:element ref="docbook:task"/>
+          <xs:element ref="docbook:productionset"/>
+          <xs:element ref="docbook:constraintdef"/>
+          <xs:element ref="docbook:msgset"/>
+          <xs:element ref="docbook:screen"/>
+          <xs:element ref="docbook:literallayout"/>
+          <xs:element ref="docbook:programlistingco"/>
+          <xs:element ref="docbook:screenco"/>
+          <xs:element ref="docbook:programlisting"/>
+          <xs:element ref="docbook:synopsis"/>
+          <xs:element ref="docbook:bridgehead"/>
+          <xs:element ref="docbook:remark"/>
+          <xs:element ref="docbook:revhistory"/>
+          <xs:element ref="docbook:indexterm"/>
+          <xs:element ref="docbook:funcsynopsis"/>
+          <xs:element ref="docbook:classsynopsis"/>
+          <xs:element ref="docbook:methodsynopsis"/>
+          <xs:element ref="docbook:constructorsynopsis"/>
+          <xs:element ref="docbook:destructorsynopsis"/>
+          <xs:element ref="docbook:fieldsynopsis"/>
+          <xs:element ref="docbook:cmdsynopsis"/>
+          <xs:element ref="docbook:caution"/>
+          <xs:element ref="docbook:important"/>
+          <xs:element ref="docbook:note"/>
+          <xs:element ref="docbook:tip"/>
+          <xs:element ref="docbook:warning"/>
+          <xs:element ref="docbook:anchor"/>
+          <xs:element ref="docbook:para"/>
+          <xs:element ref="docbook:formalpara"/>
+          <xs:element ref="docbook:simpara"/>
+          <xs:element ref="docbook:annotation"/>
+        </xs:choice>
+      </xs:sequence>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="errorcode">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="errorname">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="errortext">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="errortype">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="systemitem">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+        <xs:element ref="docbook:co"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+      <xs:attribute name="class">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="daemon"/>
+            <xs:enumeration value="domainname"/>
+            <xs:enumeration value="etheraddress"/>
+            <xs:enumeration value="event"/>
+            <xs:enumeration value="eventhandler"/>
+            <xs:enumeration value="filesystem"/>
+            <xs:enumeration value="fqdomainname"/>
+            <xs:enumeration value="groupname"/>
+            <xs:enumeration value="ipaddress"/>
+            <xs:enumeration value="library"/>
+            <xs:enumeration value="macro"/>
+            <xs:enumeration value="netmask"/>
+            <xs:enumeration value="newsgroup"/>
+            <xs:enumeration value="osname"/>
+            <xs:enumeration value="process"/>
+            <xs:enumeration value="protocol"/>
+            <xs:enumeration value="resource"/>
+            <xs:enumeration value="server"/>
+            <xs:enumeration value="service"/>
+            <xs:enumeration value="systemname"/>
+            <xs:enumeration value="username"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:attribute>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="option">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="optional">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="property">
+    <xs:complexType mixed="true">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="docbook:inlinemediaobject"/>
+        <xs:element ref="docbook:remark"/>
+        <xs:element ref="docbook:superscript"/>
+        <xs:element ref="docbook:subscript"/>
+        <xs:element ref="docbook:xref"/>
+        <xs:element ref="docbook:link"/>
+        <xs:element ref="docbook:olink"/>
+        <xs:element ref="docbook:anchor"/>
+        <xs:element ref="docbook:biblioref"/>
+        <xs:element ref="docbook:alt"/>
+        <xs:element ref="docbook:annotation"/>
+        <xs:element ref="docbook:indexterm"/>
+        <xs:element ref="docbook:phrase"/>
+        <xs:element ref="docbook:replaceable"/>
+      </xs:choice>
+      <xs:attribute name="role"/>
+      <xs:attributeGroup ref="docbook:db.common.attributes"/>
+      <xs:attributeGroup ref="docbook:db.common.linking.attributes"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/fop.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/fop.xsd
new file mode 100644 (file)
index 0000000..a787bf3
--- /dev/null
@@ -0,0 +1,4313 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- $Id$ -->
+<schema xmlns = "http://www.w3.org/2001/XMLSchema" targetNamespace = "http://www.w3.org/1999/XSL/Format"  xmlns:fo = "http://www.w3.org/1999/XSL/Format" xmlns:xs = "http://www.w3.org/2001/XMLSchema" elementFormDefault = "qualified">
+
+  <annotation>
+    <documentation> 
+
+      I'm not sure where to place this.
+      It applies to the page context (NOT implemented)
+      <attribute name = "size"  type = "size_Type"/>
+      
+      I have not coded for the functions described in 5.10 Core Function Library
+      They need to be segregated into groups and then inserted in the types
+      
+      common_functions
+      object  inherited-property-value(NCName) 
+      object  from-parent( NCName) 
+      object  from-nearest-specified-value( NCName) 
+      object  merge-property-values( NCName) 
+      
+      font_functions
+      object  system-font( NCName , NCName) 
+      
+      length_functions
+      numeric floor( numeric) 
+      numeric ceiling(numeric) 
+      numeric round(numeric) 
+      numeric min( numeric , numeric) 
+      numeric max(numeric , numeric) 
+      numeric abs( numeric)
+      
+      table_cell_or_descendants_functions
+      object  from-table-column( NCName) 
+
+      color_functions
+      color rgb(numeric , numeric , numeric) 
+      color rgb-icc(numeric , numeric , numeric , NCName , numeric , numeric) 
+      color system-color( NCName) 
+
+      label_functions
+      numeric body-start() 
+      numeric label-end() 
+      
+      (defined)
+      table-column_functions
+      numeric proportional-column-width( numeric) 
+      
+      This schema has been developed in order to validate XSL FO documents for FOP
+      All of the elements need to be prefixed with fo:
+      The namespace prefix is xmlns:fo = "http://www.w3.org/1999/XSL/Format".
+
+      This schema, as delivered, may either validate the full spec, or, just the FOP portion. 
+      (What it validates depends upon what I was doing with it when released.)
+      
+      If you want to restrict it to just those elements and attributes implemented by FOP, 
+      you need to edit the <group xmlns=""/> and <attributeGroup xmlns=""/> tags to exclude the groups ending with _Not
+
+      Some schema tools complain about the placement of comments in this schema and will remove or reorder them
+      There are fop_result and fop_fail comments on specific features not implemented by FOP
+
+      FOP does not enforce the following schema requirements
+
+      fo:simple-page-master model = "(region-body,region-before?,region-after?,region-start?,region-end?)"
+      elements can be in any order
+
+      fo:table-cell model = "(%block;)+"
+      Can be empty
+
+      fo:flow model = "(%block;)+"
+      Can be empty
+
+      This schema allows the length attribute to be negative for some elements like margins.
+      There may be instances where I've entered %integer_Type; and it should be positive-integer or number
+      The schema trys to handle the text based rules re: fo:markers, fo:float, footer and fo:initial-property-set
+      But, allows you to do illegal things if you want because I couldn't figure out how to constrain against the illegal actions.
+
+      Please e-mail your comments to cpaussa@myrealbox.com
+
+      Contribution by Oleg Tkachenko 
+      (Declarations able to include non-xsl children)
+      <xs:any minOccurs = "0" maxOccurs = "unbounded" namespace = "##other" processContents = "skip"/>
+      This declaration assumes that all <fo:color-profile/> elements must come before other stuff, 
+      which is not required by spec, but I cannot see any way to express such constraints in schema, 
+      one could use <xs:choice/> instead of <xs:sequence/>, but this way we lose control over (color-profile)+ constraint.
+      
+      VCP 21-Oct-2002 
+        Updated all (px|pt|mm|cm|in|em) to (px|pt|mm|cm|in|em|%) to allow percentage types.
+        Updated the restriction base of those types from NMTOKEN to string
+
+    </documentation>
+  </annotation>
+
+  <group name = "initial_property_set_List_Not">
+    <choice>
+      <element ref = "fo:initial-property-set"/>
+    </choice>
+  </group>
+  
+  <annotation>
+    <documentation>
+      empty group so cannot be defined
+      <group name = "initial_property_set_List_FOP">
+        <choice/>
+      </group>
+    </documentation>
+  </annotation>
+  
+  <group name = "initial_property_set_List">
+    <annotation>
+      <documentation>
+        <choice>
+          <group ref = "fo:initial_property_set_List_FOP"/>
+        </choice>
+      </documentation>
+    </annotation>
+    <choice>
+      <group ref = "fo:initial_property_set_List_Not"/>
+    </choice>
+  </group>
+  <group name = "marker_List">
+    <choice>
+      <element ref = "fo:marker"/>
+    </choice>
+  </group>
+  <group name = "inline_List_FOP">
+    <choice>
+      <element ref = "fo:character"/>
+      <element ref = "fo:external-graphic"/>
+      <element ref = "fo:instream-foreign-object"/>
+      <element ref = "fo:inline"/>
+      <element ref = "fo:leader"/>
+      <element ref = "fo:page-number"/>
+      <element ref = "fo:page-number-citation"/>
+      <element ref = "fo:basic-link"/>
+    </choice>
+  </group>
+  <group name = "inline_List_Not">
+    <choice>
+      <element ref = "fo:bidi-override"/>
+      <element ref = "fo:inline-container"/>
+      <element ref = "fo:multi-toggle"/>
+    </choice>
+  </group>
+  <group name = "inline_List">
+    <choice>
+      <group ref = "fo:inline_List_FOP"/>
+      <group ref = "fo:inline_List_Not"/>
+    </choice>
+  </group>
+  <group name = "block_List_FOP">
+    <choice>
+      <element ref = "fo:block"/>
+      <element ref = "fo:block-container"/>
+      <element ref = "fo:table"/>
+      <element ref = "fo:list-block"/>
+    </choice>
+  </group>
+  <group name = "block_List_Not">
+    <choice>
+      <element ref = "fo:table-and-caption"/>
+    </choice>
+  </group>
+  <group name = "block_List">
+    <choice>
+      <group ref = "fo:block_List_FOP"/>
+      <group ref = "fo:block_List_Not"/>
+    </choice>
+  </group>
+  <group name = "neutral_List_FOP">
+    <choice>
+      <element ref = "fo:wrapper"/>
+      <element ref = "fo:retrieve-marker"/>
+    </choice>
+  </group>
+  <group name = "neutral_List_Not">
+    <choice>
+      <element ref = "fo:multi-switch"/>
+      <element ref = "fo:multi-properties"/>
+    </choice>
+  </group>
+  <group name = "neutral_List">
+    <choice>
+      <group ref = "fo:neutral_List_FOP"/>
+      <group ref = "fo:neutral_List_Not"/>
+    </choice>
+  </group>
+  <annotation>
+    <documentation>
+      empty group so cannot be defined
+      <group name = "float_List_FOP">
+        <choice/>
+      </group>
+    </documentation>
+  </annotation>
+  <group name = "float_List_Not">
+    <choice>
+      <element ref = "fo:float"/>
+    </choice>
+  </group>
+  <group name = "float_List">
+    <annotation>
+      <documentation>
+        empty group
+        <choice>
+          <group ref = "fo:float_List_FOP"/>
+        </choice>
+      </documentation>
+    </annotation>
+    <choice>
+      <group ref = "fo:float_List_Not"/>
+    </choice>
+  </group>
+  <group name = "footnote_List">
+    <choice>
+      <element ref = "fo:footnote"/>
+    </choice>
+  </group>
+
+  <attributeGroup name = "block_properties_Not">
+    <attribute name = "page-break-after"  type = "fo:page_break_after_Type"/>
+    <attribute name = "page-break-before" type = "fo:page_break_after_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "block_properties_FOP">
+  </attributeGroup>
+  <attributeGroup name = "block_properties">
+    <attributeGroup ref = "fo:block_properties_FOP"/>
+    <attributeGroup ref = "fo:block_properties_Not"/>
+  </attributeGroup>
+
+  <attributeGroup name = "list_properties_Not">
+    <attribute name = "page-break-after"  type = "fo:page_break_after_Type"/>
+    <attribute name = "page-break-before" type = "fo:page_break_after_Type"/>
+    <attribute name = "background-position" type = "fo:background_position_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "list_properties_FOP">
+  </attributeGroup>
+  <attributeGroup name = "list_properties">
+    <attributeGroup ref = "fo:list_properties_FOP"/>
+    <attributeGroup ref = "fo:list_properties_Not"/>
+  </attributeGroup>
+
+  <attributeGroup name = "inheritable_properties_List_Not">
+    <attribute name = "auto-restore" type = "fo:auto_restore_Type"/>
+    <attribute name = "background"    type = "fo:background_Type"   /> 
+    <attribute name = "border-spacing" type = "fo:length_Type"/>
+    <attribute name = "caption-side" type = "fo:caption_side_Type"/>
+    <attribute name = "direction" type = "fo:direction_Type"/>
+    <attribute name = "empty-cells" type = "fo:empty_cells_Type"/>
+    <attribute name = "font" type = "xs:string"/>
+    <attribute name = "font-selection-strategy" type = "fo:font_selection_strategy_Type"/>
+    <attribute name = "font-size-adjust" type = "fo:font_size_adjust_Type"/>
+    <attribute name = "font-stretch" type = "xs:string"/>
+    <attribute name = "font-variant" type = "fo:font_variant_Type"/>
+    <attribute name = "glyph-orientation-vertical" type = "fo:orientation_Type"/>
+    <attribute name = "glyph-orientation-horizontal" type = "fo:orientation_Type"/>
+    <attribute name = "hyphenation-keep" type = "fo:hyphenation_keep_Type"/>
+    <attribute name = "hyphenation-ladder-count" type = "fo:hyphenation_ladder_count_Type"/>
+    <attribute name = "intrusion-displace" type = "fo:displace_Type"/>
+    <attribute name = "last-line-end-indent" type = "fo:last_line_end_indent_Type"/>
+    <attribute name = "line-height-shift-adjustment" type = "fo:line_height_shift_adjustment_Type"/>
+    <attribute name = "line-stacking-strategy" type = "fo:line_stacking_strategy_Type"/>
+    <attribute name = "linefeed-treatment" type = "fo:linefeed_treatment_Type"/>
+    <attribute name = "margin"        type = "fo:border_margin_width_Type"       /> 
+    <attribute name = "max-width"     type = "fo:max_width_Type"/>
+    <attribute name = "min-height"    type = "fo:start_indent_Type"/>
+    <attribute name = "min-width"     type = "fo:start_indent_Type"/>
+    <attribute name = "page-break-inside" type = "fo:page_break_inside_Type"/>
+    <attribute name = "reference-orientation" type = "fo:orientation_Type"/>
+    <attribute name = "score-spaces" type = "fo:score_spaces_Type"/>
+    <attribute name = "script" type = "xs:string"/>
+    <attribute name = "text-transform" type = "fo:text_transform_Type"/>
+    <attribute name = "visibility" type = "fo:visibility_Type"/>
+    <attribute name = "white-space" type = "fo:white_space_Type"/>
+    <attribute name = "white-space-treatment" type = "fo:white_space_treatment_Type"/>
+    <attribute name = "word-spacing" type = "fo:letter_spacing_Type"/>
+    <attribute name = "writing-mode" type = "fo:writing_mode_Type"/>
+  </attributeGroup>
+
+
+  <attributeGroup name = "inheritable_properties_List_FOP">
+    <annotation>
+      <documentation>
+        Removed because I'm not sure how to handle this<attribute xmlns="" name = "xml:lang" type = "xs:string"/> 
+      </documentation>
+    </annotation>
+    <attribute name = "border-bottom" type = "fo:border_side_Type"/> 
+    <attribute name = "border-collapse" type = "fo:border_collapse_Type"/>
+    <attribute name = "border-color"  type = "fo:border_color_Type" /> 
+    <attribute name = "border-left"   type = "fo:border_side_Type"  /> 
+    <attribute name = "border-right"  type = "fo:border_side_Type" /> 
+    <attribute name = "border-separation" type = "fo:length_bp_ip_direction_Type"/>
+    <attribute name = "border-style"  type = "fo:border_multi_style_Type" /> 
+    <attribute name = "border-top"    type = "fo:border_side_Type"   /> 
+    <attribute name = "border-width"  type = "fo:border_margin_width_Type" /> 
+    <attribute name = "color" type = "fo:color_Type"/>
+    <attribute name = "country" type = "fo:country_Type"/>
+    <attribute name = "display-align" type = "fo:display_align_Type"/>
+    <attribute name = "end-indent" type = "fo:end_indent_Type"/>
+    <attribute name = "font-family" type = "fo:family_name_Type"/>
+    <attribute name = "font-size" type = "fo:font_size_Type"/>
+    <attribute name = "font-style" type = "fo:font_style_Type"/>
+    <attribute name = "font-weight" type = "fo:font_weight_Type"/>
+    <attribute name = "hyphenate" type = "fo:hyphenate_Type"/>
+    <attribute name = "hyphenation-character" type = "fo:hyphenation_character_Type"/>
+    <attribute name = "hyphenation-push-character-count" type = "fo:integer_Type"/>
+    <attribute name = "hyphenation-remain-character-count" type = "fo:integer_Type"/>
+    <attribute name = "keep-together" type = "fo:keep_compound_Type"/>
+    <attribute name = "keep-together.within-column" type = "fo:keep_integer_Type"/>
+    <attribute name = "keep-together.within-line" type = "fo:keep_integer_Type"/>
+    <attribute name = "keep-together.within-page" type = "fo:keep_integer_Type"/>
+    <attribute name = "language" type = "fo:language_Type"/>
+    <attribute name = "leader-alignment" type = "fo:leader_alignment_Type"/>
+    <attribute name = "leader-length" type = "fo:leader_length_Type"/>
+    <attribute name = "leader-length.maximum" type = "fo:length_Type"/>
+    <attribute name = "leader-length.minimum" type = "fo:length_Type"/>
+    <attribute name = "leader-length.optimum" type = "fo:length_Type"/>
+    <attribute name = "leader-pattern" type = "fo:leader_pattern_Type"/>
+    <attribute name = "leader-pattern-width" type = "fo:leader_pattern_width_Type"/>
+    <attribute name = "letter-spacing" type = "fo:letter_spacing_Type"/>
+    <attribute name = "line-height" type = "fo:line_height_Type"/>
+    <attribute name = "orphans" type = "fo:orphans_Type"/>
+    <attribute name = "position" type = "fo:position_Type"/>
+    <attribute name = "provisional-distance-between-starts" type = "fo:provisional_distance_between_starts_Type"/>
+    <attribute name = "provisional-label-separation" type = "fo:provisional_label_separation_Type"/>
+    <attribute name = "relative-align" type = "fo:relative_align_Type"/>
+    <attribute name = "rule-style" type = "fo:rule_style_Type"/>
+    <attribute name = "rule-thickness" type = "fo:length_Type"/>
+    <attribute name = "start-indent" type = "fo:start_indent_Type"/>
+    <attribute name = "text-align" type = "fo:text_align_Type"/>
+    <attribute name = "text-align-last" type = "fo:text_align_last_Type"/>
+    <attribute name = "text-indent" type = "fo:length_percentage_Type"/>
+    <attribute name = "white-space-collapse" type = "fo:white_space_collapse_Type"/>
+    <attribute name = "widows" type = "fo:widows_Type"/>
+    <attribute name = "wrap-option" type = "fo:wrap_option_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "inheritable_properties_List">
+    <attributeGroup ref = "fo:inheritable_properties_List_FOP"/>
+    <attributeGroup ref = "fo:inheritable_properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "break_Properties_List_Not">
+    <annotation>
+      <documentation>
+        Inheritable
+        <attribute name = "page-break-inside" type = "fo:breaks_Type"/>
+      </documentation>
+    </annotation>
+  </attributeGroup>
+  <attributeGroup name = "break_Properties_List_FOP">
+    <attribute name = "break-after" type = "fo:breaks_Type"/>
+    <attribute name = "break-before" type = "fo:breaks_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "break_Properties_List">
+    <attributeGroup ref = "fo:break_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:break_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "text_one_Properties_List_FOP"/>
+  <attributeGroup name = "text_one_Properties_List_Not">
+    <attribute name = "text-depth" type = "fo:text_depth_Type"/>
+    <attribute name = "text-altitude" type = "fo:text_altitude_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "text_one_Properties_List">
+    <attributeGroup ref = "fo:text_one_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:text_one_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "line_height_Properties_List_FOP"/>
+  <attributeGroup name = "line_height_Properties_List_Not">
+    <annotation>
+      <documentation>
+        Inheritable
+        <attribute name = "line-height-shift-adjustment" type = "fo:line_height_shift_adjustment_Type"/>
+        <attribute name = "line-stacking-strategy" type = "fo:line_stacking_strategy_Type"/>
+      </documentation>
+    </annotation>
+  </attributeGroup>
+  <attributeGroup name = "line_height_Properties_List">
+    <attributeGroup ref = "fo:line_height_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:line_height_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "keep_Properties_List_FOP">
+    <attribute name = "keep-with-next" type = "fo:keep_integer_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "keep_Properties_List_Not">
+    <annotation>
+      <documentation>
+        Inheritable
+        <attribute name = "keep-together" type = "fo:keep_compound_Type"/>
+        <attribute name = "keep-together.within-line" type = "fo:keep_integer_Type"/>
+        <attribute name = "keep-together.within-column" type = "fo:keep_integer_Type"/>
+        <attribute name = "keep-together.within-page" type = "fo:keep_integer_Type"/>
+      </documentation>
+    </annotation>
+    <attribute name = "keep-with-previous" type = "fo:keep_integer_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "keep_Properties_List">
+    <attributeGroup ref = "fo:keep_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:keep_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "block_hyphenation_Properties_List_FOP"/>
+  <attributeGroup name = "block_hyphenation_Properties_List_Not">
+    <annotation>
+      <documentation>
+        Inheritable
+        <attribute name = "hyphenation-keep" type = "fo:hyphenation_keep_Type"/>
+        <attribute name = "hyphenation-ladder-count" type = "fo:hyphenation_ladder_count_Type"/>
+      </documentation>
+    </annotation>
+    </attributeGroup>
+  <attributeGroup name = "block_hyphenation_Properties_List">
+    <attributeGroup ref = "fo:block_hyphenation_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:block_hyphenation_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "intrusion_displace_Properties_List_FOP"/>
+  <attributeGroup name = "intrusion_displace_Properties_List_Not">
+    <annotation>
+      <documentation>
+        Inheritable attributes
+        <attribute name = "intrusion-displace" type = "fo:displace_Type"/>
+      </documentation>
+    </annotation>
+    </attributeGroup>
+  <attributeGroup name = "intrusion_displace_Properties_List">
+    <attributeGroup ref = "fo:intrusion_displace_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:intrusion_displace_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "progression_Properties_List_FOP"/>
+  <attributeGroup name = "progression_Properties_List_Not">
+    <attribute name = "block-progression-dimension" type = "fo:margin_width_Type"/>
+    <attribute name = "block-progression-dimension.minimum" type = "fo:length_Type"/>
+    <attribute name = "block-progression-dimension.optimum" type = "fo:block_progression_dimension_optimum_Type"/>
+    <attribute name = "block-progression-dimension.maximum" type = "fo:block_progression_dimension_maximum_Type"/>
+    <attribute name = "inline-progression-dimension" type = "fo:margin_width_Type"/>
+    <attribute name = "inline-progression-dimension.minimum" type = "fo:length_Type"/>
+    <attribute name = "inline-progression-dimension.optimum" type = "fo:block_progression_dimension_optimum_Type"/>
+    <attribute name = "inline-progression-dimension.maximum" type = "fo:block_progression_dimension_maximum_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "progression_Properties_List">
+    <attributeGroup ref = "fo:progression_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:progression_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "clip_Properties_List_FOP"/>
+  <attributeGroup name = "clip_Properties_List_Not">
+    <attribute name = "clip" type = "fo:clip_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "clip_Properties_List">
+    <attributeGroup ref = "fo:clip_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:clip_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "reference_Properties_List_FOP"/>
+  <attributeGroup name = "reference_Properties_List_Not">
+    <annotation>
+      <documentation>
+        Inherited
+        <attribute name = "reference-orientation" type = "fo:orientation_Type"/>
+        <attribute name = "writing-mode" type = "fo:writing_mode_Type"/>
+      </documentation>
+    </annotation>
+    </attributeGroup>
+  <attributeGroup name = "reference_Properties_List">
+    <attributeGroup ref = "fo:reference_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:reference_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Accessibility_Properties_List_FOP"/>
+  <attributeGroup name = "Accessibility_Properties_List_Not">
+    <attribute name = "source-document" type = "xs:string"/>
+    <attribute name = "role" type = "xs:string"/>
+  </attributeGroup>
+  <attributeGroup name = "Accessibility_Properties_List">
+    <attributeGroup ref = "fo:Accessibility_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:Accessibility_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Relative_Position_Properties_List_FOP">
+    <annotation>
+      <documentation>
+        Inherited
+        <attribute name = "position" type = "fo:position_Type"/>
+      </documentation>
+    </annotation>
+    <attribute name = "top" type = "fo:top_Type"/>
+    <attribute name = "right" type = "fo:right_Type"/>
+    <attribute name = "bottom" type = "fo:bottom_Type"/>
+    <attribute name = "left" type = "fo:left_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Relative_Position_Properties_List_Not">
+    <attribute name = "relative-position" type = "fo:relative_position_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Relative_Position_Properties_List">
+    <attributeGroup ref = "fo:Relative_Position_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:Relative_Position_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "absolute_or_Relative_Position_Properties_List_FOP">
+    <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+  </attributeGroup>
+  <attributeGroup name = "absolute_or_Relative_Position_Properties_List_Not">
+    <attribute name = "absolute-position" type = "fo:absolute_position_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "absolute_or_Relative_Position_Properties_List">
+    <attributeGroup ref = "fo:absolute_or_Relative_Position_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:absolute_or_Relative_Position_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Aural_Properties_List_FOP"/>
+  <attributeGroup name = "Aural_Properties_List_Not">
+    <attribute name = "azimuth" type = "fo:azimuth_Type"/>
+    <attribute name = "cue" type = "xs:string"/>
+    <attribute name = "cue-after" type = "xs:string"/>
+    <attribute name = "cue-before" type = "xs:string"/>
+    <attribute name = "elevation" type = "fo:elevation_Type"/>
+    <attribute name = "pause" type = "xs:string"/>
+    <attribute name = "pause-after" type = "xs:string"/>
+    <attribute name = "pause-before" type = "xs:string"/>
+    <attribute name = "pitch" type = "xs:string"/>
+    <attribute name = "pitch-range" type = "xs:string"/>
+    <attribute name = "play-during" type = "xs:string"/>
+    <attribute name = "richness" type = "xs:string"/>
+    <attribute name = "speak" type = "xs:string"/>
+    <attribute name = "speak-header" type = "xs:string"/>
+    <attribute name = "speak-numeral" type = "fo:speak_numeral_Type"/>
+    <attribute name = "speak-punctuation" type = "xs:string"/>
+    <attribute name = "speech-rate" type = "fo:speech_rate_Type"/>
+    <attribute name = "stress" type = "xs:string"/>
+    <attribute name = "voice-family" type = "xs:string"/>
+    <attribute name = "volume" type = "xs:string"/>
+  </attributeGroup>
+  <attributeGroup name = "Aural_Properties_List">
+    <attributeGroup ref = "fo:Aural_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:Aural_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Border_Padding_and_Background_Properties_List">
+    <attributeGroup ref = "fo:Border_Properties_List"/>
+    <attributeGroup ref = "fo:Padding_Properties_List"/>
+    <attributeGroup ref = "fo:Background_Properties_List"/>
+  </attributeGroup>
+  <attributeGroup name = "Absolute_Position_Properties_List_FOP">
+    <annotation>
+      <documentation>
+        Inherited
+        <attribute name = "position" type = "fo:position_Type"/>
+      </documentation>
+    </annotation>
+    <attribute name = "top" type = "fo:top_Type"/>
+    <attribute name = "right" type = "fo:right_Type"/>
+    <attribute name = "bottom" type = "fo:bottom_Type"/>
+    <attribute name = "left" type = "fo:left_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Absolute_Position_Properties_List_Not">
+    <attribute name = "absolute-position" type = "fo:absolute_position_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Absolute_Position_Properties_List">
+    <attributeGroup ref = "fo:Absolute_Position_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:Absolute_Position_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Background_Properties_List_FOP">
+    <attribute name = "background-color" type = "fo:background_color_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Background_Properties_List_Not">
+    <attribute name = "background-attachment" type = "fo:background_attachment_Type"/>
+    <attribute name = "background-image" type = "xs:string"/>
+    <attribute name = "background-repeat" type = "fo:background_repeat_Type"/>
+    <attribute name = "background-position-horizontal" type = "fo:background_position_horizontal_Type"/>
+    <attribute name = "background-position-vertical" type = "fo:background_position_vertical_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Background_Properties_List">
+    <attributeGroup ref = "fo:Background_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:Background_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Border_Properties_List">
+    <attribute name = "border" type = "fo:border_Type"/>
+    <attribute name = "border-before-color" type = "fo:color_Type"/>
+    <attribute name = "border-before-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-before-width" type = "fo:border_before_width_Type"/>
+    <attribute name = "border-before-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-before-width.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "border-after-color" type = "fo:color_Type"/>
+    <attribute name = "border-after-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-after-width" type = "fo:border_before_width_Type"/>
+    <attribute name = "border-after-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-after-width.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "border-start-color" type = "fo:color_Type"/>
+    <attribute name = "border-start-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-start-width" type = "fo:border_before_width_Type"/>
+    <attribute name = "border-start-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-start-width.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "border-end-color" type = "fo:color_Type"/>
+    <attribute name = "border-end-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-end-width" type = "fo:border_before_width_Type"/>
+    <attribute name = "border-end-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-end-width.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "border-top-color" type = "fo:color_Type"/>
+    <attribute name = "border-top-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-top-width" type = "fo:border_top_width_Type"/>
+    <attribute name = "border-top-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-top-width.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "border-bottom-color" type = "fo:color_Type"/>
+    <attribute name = "border-bottom-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-bottom-width" type = "fo:border_top_width_Type"/>
+    <attribute name = "border-bottom-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-bottom-width.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "border-left-color" type = "fo:color_Type"/>
+    <attribute name = "border-left-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-left-width" type = "fo:border_top_width_Type"/>
+    <attribute name = "border-left-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-left-width.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "border-right-color" type = "fo:color_Type"/>
+    <attribute name = "border-right-style" type = "fo:border_style_Type"/>
+    <attribute name = "border-right-width" type = "fo:border_top_width_Type"/>
+    <attribute name = "border-right-width.length" type = "fo:length_Type"/>
+    <attribute name = "border-right-width.conditionality" type = "fo:conditionality_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Padding_Properties_List">
+    <attribute name = "padding" type = "fo:padding_before_Type"/>
+    <attribute name = "padding-before" type = "fo:padding_before_Type"/>
+    <attribute name = "padding-before.length" type = "fo:length_Type"/>
+    <attribute name = "padding-before.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "padding-after" type = "fo:padding_before_Type"/>
+    <attribute name = "padding-after.length" type = "fo:length_Type"/>
+    <attribute name = "padding-after.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "padding-start" type = "fo:padding_before_Type"/>
+    <attribute name = "padding-start.length" type = "fo:length_Type"/>
+    <attribute name = "padding-start.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "padding-end" type = "fo:padding_before_Type"/>
+    <attribute name = "padding-end.length" type = "fo:length_Type"/>
+    <attribute name = "padding-end.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "padding-top" type = "fo:padding_top_Type"/>
+    <attribute name = "padding-top.length" type = "fo:length_Type"/>
+    <attribute name = "padding-top.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "padding-bottom" type = "fo:padding_top_Type"/>
+    <attribute name = "padding-bottom.length" type = "fo:length_Type"/>
+    <attribute name = "padding-bottom.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "padding-left" type = "fo:padding_top_Type"/>
+    <attribute name = "padding-left.length" type = "fo:length_Type"/>
+    <attribute name = "padding-left.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "padding-right" type = "fo:padding_top_Type"/>
+    <attribute name = "padding-right.length" type = "fo:length_Type"/>
+    <attribute name = "padding-right.conditionality" type = "fo:conditionality_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Font_Properties_List_FOP">
+    <annotation>
+      <documentation>
+        Font properties are all inheritable
+        <attribute name = "font-family" type = "fo:family_name_Type"/>
+        <attribute name = "font-size" type = "fo:font_size_Type"/>
+        <attribute name = "font-style" type = "fo:font_style_Type"/>
+        <attribute name = "font-weight" type = "fo:font_weight_Type"/>
+      </documentation>
+    </annotation>
+    </attributeGroup>
+  <attributeGroup name = "Font_Properties_List_Not">
+    <annotation>
+      <documentation>
+        Font properties are all inheritable
+        <attribute name = "font" type = "xs:string"/>
+        <attribute name = "font-selection-strategy" type = "fo:font_selection_strategy_Type"/>
+        <attribute name = "font-size-adjust" type = "xs:string"/>
+        <attribute name = "font-stretch" type = "xs:string"/>
+        <attribute name = "font-variant" type = "fo:font_variant_Type"/>
+      </documentation>
+    </annotation>
+    </attributeGroup>
+  <attributeGroup name = "Font_Properties_List">
+    <attributeGroup ref = "fo:Font_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:Font_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Hyphenation_Properties_List_FOP">
+    <annotation>
+      <documentation>
+        The hyphenation properties are all inheritable and so superceeded by that list 
+        <attribute name = "country" type = "fo:country_Type"/>
+        <attribute name = "language" type = "fo:language_Type"/>
+        <attribute name = "hyphenate" type = "fo:hyphenate_Type"/>
+        <attribute name = "hyphenation-character" type = "fo:hyphenation_character_Type"/>
+        <attribute name = "hyphenation-push-character-count" type = "fo:integer_Type"/>
+        <attribute name = "hyphenation-remain-character-count" type = "fo:integer_Type"/>
+      </documentation>
+    </annotation>
+    </attributeGroup>
+  <attributeGroup name = "Hyphenation_Properties_List_Not">
+    <annotation>
+      <documentation>
+        The hyphenation properties are all inheritable and so superceeded by that list 
+        <attribute name = "script" type = "xs:string"/>
+      </documentation>
+    </annotation>
+    </attributeGroup>
+  <attributeGroup name = "Hyphenation_Properties_List">
+    <attributeGroup ref = "fo:Hyphenation_Properties_List_FOP"/>
+    <attributeGroup ref = "fo:Hyphenation_Properties_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_Basic_List">
+    <attribute name = "margin-top" type = "fo:margin_width_Type"/>
+    <attribute name = "margin-bottom" type = "fo:margin_width_Type"/>
+    <attribute name = "margin-left" type = "fo:margin_width_Type"/>
+    <attribute name = "margin-right" type = "fo:margin_width_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_vertical_Space_List_FOP">
+    <annotation>
+      <documentation>
+        Indent properties are inheritable
+        <attribute name = "start-indent" type = "fo:start_indent_Type"/>
+        <attribute name = "end-indent" type = "fo:end_indent_Type"/>
+      </documentation>
+    </annotation>
+    <attribute name = "space-before.optimum" type = "fo:space_before_optimum_Type"/>
+    <attribute name = "space-after.optimum" type = "fo:space_after_optimum_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_vertical_Space_List_Not">
+    <attribute name = "space-before" type = "fo:space_Type"/>
+    <attribute name = "space-before.minimum" type = "fo:length_Type"/>
+    <attribute name = "space-before.maximum" type = "fo:length_Type"/>
+    <attribute name = "space-before.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "space-before.precedence" type = "fo:integer_Force_Type"/>
+    <attribute name = "space-after" type = "fo:space_Type"/>
+    <attribute name = "space-after.minimum" type = "fo:length_Type"/>
+    <attribute name = "space-after.maximum" type = "fo:length_Type"/>
+    <attribute name = "space-after.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "space-after.precedence" type = "fo:integer_Force_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_vertical_Space_List">
+    <attributeGroup ref = "fo:Margin_Properties_vertical_Space_List_FOP"/>
+    <attributeGroup ref = "fo:Margin_Properties_vertical_Space_List_Not"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_Block_List">
+    <attributeGroup ref = "fo:Margin_Properties_Basic_List"/>
+    <attributeGroup ref = "fo:Margin_Properties_vertical_Space_List"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_Inline_List">
+    <attributeGroup ref = "fo:Margin_Properties_Basic_List"/>
+    <attributeGroup ref = "fo:Margin_Properties_Horizontal_Space_List"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_Horizontal_Space_List_FOP"/>
+  <attributeGroup name = "Margin_Properties_Horizontal_Space_List_Not">
+    <attribute name = "space-start" type = "fo:space_start_Type"/>
+    <attribute name = "space-start.minimum" type = "fo:length_Type"/>
+    <attribute name = "space-start.optimum" type = "fo:length_Type"/>
+    <attribute name = "space-start.maximum" type = "fo:length_Type"/>
+    <attribute name = "space-start.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "space-start.precedence" type = "fo:integer_Force_Type"/>
+    <attribute name = "space-end" type = "fo:space_start_Type"/>
+    <attribute name = "space-end.minimum" type = "fo:length_Type"/>
+    <attribute name = "space-end.optimum" type = "fo:length_Type"/>
+    <attribute name = "space-end.maximum" type = "fo:length_Type"/>
+    <attribute name = "space-end.conditionality" type = "fo:conditionality_Type"/>
+    <attribute name = "space-end.precedence" type = "fo:integer_Force_Type"/>
+  </attributeGroup>
+  <attributeGroup name = "Margin_Properties_Horizontal_Space_List">
+    <attributeGroup ref = "fo:Margin_Properties_Horizontal_Space_List_FOP"/>
+    <attributeGroup ref = "fo:Margin_Properties_Horizontal_Space_List_Not"/>
+  </attributeGroup>
+
+  <annotation>
+    <documentation>
+      Simple Types definitions
+    </documentation>
+  </annotation>
+  <simpleType name = "integer_Type">
+    <annotation>
+      <documentation>
+        A signed integer value which consists of an optional '+' or '-' character followed by a sequence of digits. A property may define additional constraints on the value.
+        <enumeration value = "-3"/>
+        <enumeration value = "0"/>
+        <enumeration value = "1"/>
+        <enumeration value = "+3"/>
+        <enumeration value = "5"/>
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <pattern value = "[\+\-]?\d+"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "number_Type">
+    <annotation>
+      <documentation>
+        A signed real number which consists of an optional '+' or '-' character followed by a sequence of digits followed by an optional '.' character and sequence of digits. A property may define additional constraints on the value. 
+        <enumeration value = "-2.4"/>
+        <enumeration value = "2"/>
+        <enumeration value = "4"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "[\+\-]?\d+\.\d*"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "length_Type">
+    <annotation>
+      <documentation>
+        A signed length value where a 'length' is a real number plus a unit qualification. A property may define additional constraints on the value.
+        <enumeration value = "1px"/>
+        <enumeration value = "1pt"/>
+        <enumeration value = "1mm"/>
+        <enumeration value = "1cm"/>
+        <enumeration value = "1in"/>
+        <enumeration value = "1em"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "[\+\-]?\d+\.?\d*(px|pt|mm|cm|in|em|%)"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "length_range_Type">
+    <annotation>
+      <documentation>
+        A compound datatype, with components: minimum, optimum, maximum. Each component is a <length xmlns=""/>. If "minimum" is greater than optimum, it will be treated as if it had been set to "optimum". If "maximum" is less than optimum, it will be treated as if it had been set to "optimum". A property may define additional constraints on the values.
+        <enumeration value = "1mm 2mm 3mm"/>
+        <enumeration value = "2mm 2mm 1mm"/>
+        <enumeration value = "3mm 2mm 1mm"/>
+      </documentation>
+    </annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <xs:restriction base = "fo:length_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "3" />
+      <xs:maxLength value = "3" />
+    </xs:restriction>
+  </simpleType>
+  <simpleType name = "length_conditional_Type">
+    <annotation>
+      <documentation>
+        A compound datatype, with components: length, conditionality. The length component is a <length xmlns=""/>. The conditionality component is either "discard" or "retain". A property may define additional constraints on the values.
+        <enumeration value = "1mm retain"/>
+        <enumeration value = "1mm discard"/>
+        <enumeration value = "1px retain"/>
+        <enumeration value = "1px discard"/>
+        <enumeration value = "1pt retain"/>
+        <enumeration value = "1pt discard"/>
+        <enumeration value = "1mm retain"/>
+        <enumeration value = "1mm discard"/>
+        <enumeration value = "1cm retain"/>
+        <enumeration value = "1cm discard"/>
+        <enumeration value = "1in retain"/>
+        <enumeration value = "1in discard"/>
+        <enumeration value = "1em retain"/>
+        <enumeration value = "1em discard"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "\+?\d+\.?\d*(px|pt|mm|cm|in|em|%) (retain|discard)"/>
+    </restriction>
+  </simpleType>
+  <xs:simpleType name = "length_bp_ip_direction_Type">
+    <annotation>
+      <documentation>
+        A compound datatype, with components: block-progression-direction, and inline-progression-direction. Each component is a <length xmlns=""/>. A property may define additional constraints on the values.
+        <enumeration value = "1mm 2mm"/>
+        <enumeration value = "2mm"/>
+        <enumeration value = "3mm 2mm"/>
+      </documentation>
+    </annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <xs:restriction base = "fo:length_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "1" />
+      <xs:maxLength value = "2" />
+    </xs:restriction>
+  </xs:simpleType>
+  <simpleType name = "space_Type">
+    <annotation>
+      <documentation>
+        A compound datatype, with components: minimum, optimum, maximum, precedence, and conditionality. The minimum, optimum, and maximum components are <length xmlns=""/>s. The precedence component is either "force" or an <integer/>. The conditionality component is either "discard" or "retain". If "minimum" is greater than optimum, it will be treated as if it had been set to "optimum". If "maximum" is less than optimum, it will be treated as if it had been set to "optimum".
+        <enumeration value = "1mm 2mm 3mm force retain"/>
+        <enumeration value = "1mm 2mm 3mm force discard"/>
+        <enumeration value = "1mm 2mm 3mm 3 retain"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "([ ]?\+?\d+\.?\d*(px|pt|mm|cm|in|em|%)){1,3}( \+?\d+| force)?( retain| discard)?"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "angle_Type">
+    <annotation>
+      <documentation>
+        A representation of an angle consisting of an optional '+' or  '-' character immediately followed by a <number/> immediately followed by an angle unit identifier. Angle unit identifiers are: 'deg' (for degrees), 'grad' (for grads), and 'rad' (for radians). The specified values are normalized to the range 0deg to 360deg. A property may define additional constraints on the value.
+        <enumeration value = "3deg"/>
+        <enumeration value = "45deg"/>
+        <enumeration value = "-12deg"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "[\+\-]?[1-3]?\d?\d?\.?\d*(deg|grad|rad)"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "percentage_Type">
+    <annotation>
+      <documentation>
+        A signed real percentage which consists of an optional '+' or '-' character followed by a sequence of digits followed by an optional '.' character and sequence of digits followed by '%'. A property may define additional constraints on the value.
+        <enumeration value = "10%"/>
+        <enumeration value = "30%"/>
+        <enumeration value = "100%"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "[\+\-]?\d+\.?\d*%"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "character_Type">
+    <annotation>
+      <documentation>
+        <enumeration value = "-"/>
+        <enumeration value = "h"/>
+        <enumeration value = "e"/>
+        <enumeration value = "l"/>
+        <enumeration value = "p"/>
+        <enumeration value = "o"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "."/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "name_Type">
+    <annotation>
+      <documentation>
+        A string of characters representing a name. It must conform to the definition of an NCName in
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = ".*"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "family_name_Type">
+    <annotation>
+      <documentation>
+        A string of characters identifying a font.
+        <enumeration value = "serif"/>
+        <enumeration value = "sans-serif"/>
+        <enumeration value = "Arial"/>
+        <enumeration value = "Times"/>
+        <enumeration value = "Courier"/>
+        <enumeration value = "Zapf Dingbats"/>
+        <enumeration value = "code39"/>
+        <enumeration value = "cyberbit"/>
+        <enumeration value = "Edwardian Script ITC"/>
+        <enumeration value = "Viner Hand ITC"/>
+        <enumeration value = "Georgia"/>
+        <enumeration value = "Bookman Old Style"/>
+        <enumeration value = "Book Antiqua"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = ".*"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "color_Type">
+    <annotation>
+      <documentation>
+        Either a string of characters representing a keyword or a color function defined in . The list of keyword color names is: aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, and yellow.
+        <enumeration value = "red"/>
+        <enumeration value = "blue"/>
+        <enumeration value = "yellow"/>
+        <enumeration value = "green"/>
+      </documentation>
+    </annotation>
+    <union memberTypes = "fo:color_Hex_Type fo:color_Name_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "proportional_column_width_Type">
+    <annotation>
+      <documentation>
+        The function proportional-column-width(N[0])
+        This returns a width as a fraction of the available width as ( N[0] / sum1 ) * available space
+        The parent table must have width="x" and table-layout="fixed"
+        <enumeration value = "proportional-column-width(Number)"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "proportional-column-width\(\d+\)"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "column_width_Type">
+    <annotation>
+      <documentation>
+        <length xmlns=""/>, <percentage/>, <function>proportional-column-width</function>, or <function>common-functions</function>
+        <enumeration value = "20mm"/>
+        <enumeration value = "15%"/>
+      </documentation>
+    </annotation>
+    <union memberTypes = "fo:length_percentage_Type fo:proportional_column_width_Type"/>
+  </simpleType>
+  <annotation>
+    <documentation>
+      <script/> A string of characters conforming to an ISO 15924 script code.
+    </documentation>
+  </annotation>
+  <annotation>
+    <documentation>
+      <id/>     A string of characters conforming to the definition of an NCName in and is unique within the stylesheet.
+    </documentation>
+  </annotation>
+  <annotation>
+    <documentation>
+      <idRef/>  A string of characters conforming to the definition of an NCName in and that matches an ID property value used within the stylesheet.
+    </documentation>
+  </annotation>
+  <annotation>
+    <documentation>
+      <uri-specification/> A sequence of characters that is "url(", followed by optional white space, followed by an optional single quote (') or double quote (") character, followed by a URI reference as defined in , followed by an optional single quote (') or double quote (") character, followed by optional white space, followed by ")". The two quote characters must be the same and must both be present or absent. If the URI reference contains a single quote, the two quote characters must be present and be double quotes.
+    </documentation>
+  </annotation>
+  <annotation>
+    <documentation>
+      <time/>   A <number/> immediately followed by a time unit identifier. Time unit identifiers are: 'ms' (for milliseconds) and 's' (for seconds).
+    </documentation>
+  </annotation>
+  <annotation>
+    <documentation>
+      <frequency/> A <number/> immediately followed by a frequency unit identifier. Frequency unit identifiers are: 'Hz' (for Hertz) and 'kHz' (for kilo Hertz).
+    </documentation>
+  </annotation>
+  <annotation>
+    <documentation>
+      <generic-family/> The following generic families are defined: "serif", "sans-serif", "cursive", "fantasy", and "monospace". Please see the section on generic font families for descriptions of these families. Generic font family names are keywords, and therefore must not be quoted.
+    </documentation>
+  </annotation>
+  <simpleType name = "absolute_size_Type">
+    <annotation>
+      <documentation>
+        An <absolute-size/> keyword refers to an entry in a table of font sizes computed and kept by the user agent. Possible values are: [ xx-small | x-small | small | medium | large | x-large | xx-large ] On a computer screen a scaling factor of 1.2 is suggested between adjacent indexes; if the "medium" font is 12pt, the "large" font could be 14.4pt. Different media may need different scaling factors. Also, the user agent should take the quality and availability of fonts into account when computing the table. The table may be different from one font family to another. Note. In CSS1, the suggested scaling factor between adjacent indexes was 1.5 which user experience proved to be too large.
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "xx-small"/>
+      <enumeration value = "x-small"/>
+      <enumeration value = "small"/>
+      <enumeration value = "medium"/>
+      <enumeration value = "large"/>
+      <enumeration value = "x-large"/>
+      <enumeration value = "xx-large"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "relative_size_Type">
+    <annotation>
+      <documentation>
+        A <relative-size/> keyword is interpreted relative to the table of font sizes and the font size of the parent element. Possible values are: [ larger | smaller ] For example, if the parent element has a font size of "medium", a value of "larger" will make the font size of the current element be "large". If the parent element's size is not close to a table entry, the user agent is free to interpolate between table entries or round off to the closest one. The user agent may have to extrapolate table values if the numerical value goes beyond the keywords.
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "larger"/>
+      <enumeration value = "smaller"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "clip_Type">
+    <annotation>
+      <documentation>
+        shape_Type In CSS2, the only valid <shape/> value is: rect (<top/>, <right/>, <bottom/>, <left/>) where <top/>, <bottom/> <right/>, and <left/> specify offsets from the respective sides of the box. <top/>, <right/>, <bottom/>, and <left/> may either have a <length xmlns=""/> value or "auto". Negative lengths are permitted. The value "auto" means that a given edge of the clipping region will be the same as the edge of the element's generated box (i.e., "auto" means the same as "0".) When coordinates are rounded to pixel coordinates, care should be taken that no pixels remain visible when <left/> + <right/> is equal to the element's width (or <top/> + <bottom/> equals the element's height), and conversely that no pixels remain hidden when these values are 0.
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <annotation>
+        <documentation>
+          length_Type{1,2}
+        </documentation>
+      </annotation>
+      <pattern value = "(rect\((\+?\d+\.?\d*(px|pt|mm|cm|in|em|%)|auto),(\+?\d+\.?\d*(px|pt|mm|cm|in|em|%)|auto),(\+?\d+\.?\d*(px|pt|mm|cm|in|em|%)|auto),(\+?\d+\.?\d*(px|pt|mm|cm|in|em|%)|auto)\)|auto|inherit)"/>
+    </restriction>
+  </simpleType>
+  
+  <simpleType name = "border_side_Type">
+    <annotation>
+      <documentation>
+        "fo:width_Type fo:border_style_Type fo:color_Type"
+        <enumeration value="thin solid red"/>
+        <enumeration value="medium solid black"/>
+        <enumeration value="thick solid blue"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "(thin|medium|thick) (none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset) ([a-z]{3,16}|#[0-9A-F]{6})"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "border_margin_width_Type">
+    <annotation>
+      <documentation>
+        "fo:width_Type{1,4} fo:inherit_Type"
+        <enumeration value = "none"/>
+        <enumeration value = "thin"/>
+        <enumeration value = "medium"/>
+        <enumeration value = "thick"/>
+        <enumeration value = "thick thin medium none"/>
+      </documentation>
+    </annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <union memberTypes = "fo:width_Type fo:positive_length_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "1" />
+      <xs:maxLength value = "4" />
+    </xs:restriction>
+  </simpleType>
+  <simpleType name = "border_multi_style_Type" >
+    <annotation>
+      <documentation>
+        "fo:border_style_Type{1,4} fo:inherit_Type"
+        <enumeration value = "none"/>
+        <enumeration value = "hidden"/>
+        <enumeration value = "dotted"/>
+        <enumeration value = "dashed"/>
+        <enumeration value = "solid"/>
+        <enumeration value = "double"/>
+        <enumeration value = "groove"/>
+        <enumeration value = "ridge"/>
+        <enumeration value = "inset"/>
+        <enumeration value = "outset"/>
+        <enumeration value = "solid dashed ridge groove"/>
+      </documentation>
+    </annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <xs:restriction base = "fo:border_style_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "1" />
+      <xs:maxLength value = "4" />
+    </xs:restriction>
+  </simpleType>
+  <simpleType name = "border_color_Type" >
+    <annotation>
+      <documentation>
+        "fo:background_color_Type{1,4}"
+        <enumeration value="red"/>
+        <enumeration value="green"/>
+        <enumeration value="blue red yellow"/>
+        <enumeration value="black"/>
+        <enumeration value="black red yellow green"/>
+        <enumeration value="silver black"/>
+      </documentation>
+    </annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <xs:restriction base = "fo:color_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "1" />
+      <xs:maxLength value = "4" />
+    </xs:restriction>
+  </simpleType>
+  <simpleType name = "max_width_Type">
+    <annotation>
+      <documentation>
+        <enumeration value="100%"/>
+        <enumeration value="160mm"/>
+      </documentation>
+    </annotation>
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:none_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "background_Type">
+    <union memberTypes = "fo:background_color_Type fo:background_image_Type fo:background_repeat_Type fo:background_attachment_Type fo:background_position_Type"/>
+  </simpleType>
+  <simpleType name = "background_position_Type">
+    <union memberTypes = "fo:background_position_percentage_Type fo:background_position_length_Type fo:background_position_base_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "background_position_percentage_Type">
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <xs:restriction base = "fo:percentage_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "1" />
+      <xs:maxLength value = "2" />
+    </xs:restriction>
+  </simpleType>
+  <simpleType name = "background_position_length_Type">
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <xs:restriction base = "fo:length_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "1" />
+      <xs:maxLength value = "2" />
+    </xs:restriction>
+  </simpleType>
+  <simpleType name = "background_position_base_Type">
+    <restriction base = "string">
+      <enumeration value = "top left"/>
+      <enumeration value = "top center"/>
+      <enumeration value = "top right"/>
+      <enumeration value = "center left"/>
+      <enumeration value = "center center"/>
+      <enumeration value = "center right"/>
+      <enumeration value = "bottom left"/>
+      <enumeration value = "bottom center"/>
+      <enumeration value = "bottom right"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "size_Type">
+    <union memberTypes = "fo:background_position_length_Type fo:size_base_Type"/>
+  </simpleType>
+  <simpleType name = "size_base_Type">
+    <restriction base = "string">
+      <enumeration value = "auto"/>
+      <enumeration value = "landscape"/>
+      <enumeration value = "portrait"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "vertical_align_base_Type">
+    <restriction base = "string">
+      <enumeration value = "baseline"/>
+      <enumeration value = "middle"/>
+      <enumeration value = "sub"/>
+      <enumeration value = "super"/>
+      <enumeration value = "text-top"/>
+      <enumeration value = "text-bottom"/>
+      <enumeration value = "top"/>
+      <enumeration value = "bottom"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "vertical_align_Type">
+    <union memberTypes = "fo:vertical_align_base_Type fo:percentage_Type fo:length_Type"/>
+  </simpleType>
+  <simpleType name = "leader_length_Type">
+    <annotation>
+      <documentation>
+        <enumeration value = "50% 100% 100%"/>
+      </documentation>
+    </annotation>
+    <union memberTypes = "fo:length_range_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "letter_spacing_Type">
+    <union memberTypes = "fo:normal_Type fo:length_Type fo:space_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "font_size_adjust_Type">
+    <union memberTypes = "fo:number_Type fo:none_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_start_Type">
+    <union memberTypes = "fo:space_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "normal_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "normal"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "background_attachment_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "scroll"/>
+      <enumeration value = "fixed"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "background_repeat_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "repeat"/>
+      <enumeration value = "repeat-x"/>
+      <enumeration value = "repeat-y"/>
+      <enumeration value = "no-repeat"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "speech_rate_base_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "x-slow"/>
+      <enumeration value = "slow"/>
+      <enumeration value = "medium"/>
+      <enumeration value = "fast"/>
+      <enumeration value = "x-fast"/>
+      <enumeration value = "faster"/>
+      <enumeration value = "slower"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "speech_rate_Type">
+    <union memberTypes = "fo:speech_rate_base_Type fo:integer_Type"/>
+  </simpleType>
+  <simpleType name = "speak_numeral_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "digits"/>
+      <enumeration value = "continuous"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "font_variant_Type">
+    <restriction base = "string">
+      <enumeration value = "normal"/>
+      <enumeration value = "small-caps"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "line_height_Type">
+    <union memberTypes = "fo:normal_Type fo:length_Type fo:integer_Type fo:percentage_Type fo:space_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "text_shadow_Type">
+    <union memberTypes = "fo:none_Type fo:color_Type fo:length_range_Type"/>
+  </simpleType>
+  <simpleType name = "height_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:auto_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "hyphenation_character_Type">
+    <union memberTypes = "fo:character_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "content_height_Type">
+    <union memberTypes = "fo:auto_Type fo:scale_to_fit_Type fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "scale_to_fit_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "scale-to-fit"/>
+    </restriction>
+  </simpleType>
+
+  <simpleType name = "font_weight_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "normal"/>
+      <enumeration value = "bold">
+        <annotation>
+          <documentation>
+            <fop_result>heavier than no value</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "bolder">
+        <annotation>
+          <documentation>
+            <fop_result>lighter than normal</fop_result> <fop_fail>unknown font</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "lighter">
+        <annotation>
+          <documentation>
+            <fop_result>lighter than normal</fop_result> <fop_fail>unknown font</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "100">
+        <annotation>
+          <documentation>
+            <fop_result>same as normal</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "200">
+        <annotation>
+          <documentation>
+            <fop_result>same as normal</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "300">
+        <annotation>
+          <documentation>
+            <fop_result>same as normal</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "400">
+        <annotation>
+          <documentation>
+            <fop_result>same as normal</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "500">
+        <annotation>
+          <documentation>
+            <fop_result>same as normal</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "600">
+        <annotation>
+          <documentation>
+            <fop_result>same as normal</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "700">
+        <annotation>
+          <documentation>
+            <fop_result>same as bold</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "800">
+        <annotation>
+          <documentation>
+            <fop_result>same as bold</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "900">
+        <annotation>
+          <documentation>
+            <fop_result>same as bold</fop_result>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_result>lighter than normal</fop_result> <fop_fail>unknown font</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "font_style_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "normal"/>
+      <enumeration value = "italic"/>
+      <enumeration value = "oblique"/>
+      <enumeration value = "backslant">
+        <annotation>
+          <documentation>
+            <fop_fail>unknown font</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>unknown font</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "page_break_inside_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "avoid"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "page_break_after_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "always"/>
+      <enumeration value = "avoid"/>
+      <enumeration value = "left"/>
+      <enumeration value = "right"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "white_space_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "normal"/>
+      <enumeration value = "pre"/>
+      <enumeration value = "nowrap"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "show_destination_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "replace"/>
+      <enumeration value = "new"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "indicate_destination_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "speak_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "normal"/>
+      <enumeration value = "none"/>
+      <enumeration value = "spell-out"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "relative_align_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "before"/>
+      <enumeration value = "baseline"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "empty_cells_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "show"/>
+      <enumeration value = "hide"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "ends_row_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "starts_row_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "position_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "static"/>
+      <enumeration value = "relative"/>
+      <enumeration value = "absolute"/>
+      <enumeration value = "fixed"/>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "conditionality_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "retain"/>
+      <enumeration value = "discard"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "keep_compound_Type">
+    <annotation>
+      <documentation>
+        A compound datatype, with components: within-line, within-column, within-page. Each component is a <keep/>. 
+        <enumeration value = "2 auto always"/>
+        <enumeration value = "auto"/>
+        <enumeration value = "always"/>
+      </documentation>
+    </annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list>
+          <xs:simpleType>
+            <xs:restriction base = "fo:keep_integer_Type"/>
+          </xs:simpleType>
+        </xs:list>
+      </xs:simpleType>
+      <xs:minLength value = "1" />
+      <xs:maxLength value = "3" />
+    </xs:restriction>
+  </simpleType>
+  <simpleType name = "keep_integer_Type">
+    <annotation>
+      <documentation>
+        <enumeration value = "2"/>
+        <enumeration value = "5"/>
+        <enumeration value = "10"/>
+        <enumeration value = "auto"/>
+        <enumeration value = "always"/>
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <pattern value = "(\+?\d+|auto|always)"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "letter_value_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "alphabetic"/>
+      <enumeration value = "traditional"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "alignment_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "baseline"/>
+      <enumeration value = "before-edge"/>
+      <enumeration value = "text-before-edge"/>
+      <enumeration value = "middle"/>
+      <enumeration value = "central"/>
+      <enumeration value = "after-edge"/>
+      <enumeration value = "text-after-edge"/>
+      <enumeration value = "ideographic"/>
+      <enumeration value = "alphabetic"/>
+      <enumeration value = "hanging"/>
+      <enumeration value = "mathematical"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "box_alignment_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "top"/>
+      <enumeration value = "text-top"/>
+      <enumeration value = "bottom"/>
+      <enumeration value = "text-bottom"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "breaks_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "auto"/>
+      <enumeration value = "column"/>
+      <enumeration value = "page"/>
+      <enumeration value = "even-page"/>
+      <enumeration value = "odd-page"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "force_page_count_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "even"/>
+      <enumeration value = "odd"/>
+      <enumeration value = "end-on-even"/>
+      <enumeration value = "end-on-odd"/>
+      <enumeration value = "no-force"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "table_layout_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "fixed"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "scaling_method_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "integer-pixels"/>
+      <enumeration value = "resample-any-method"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "displace_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "inherit"/>
+      <enumeration value = "auto"/>
+      <enumeration value = "none"/>
+      <enumeration value = "line"/>
+      <enumeration value = "indent"/>
+      <enumeration value = "block"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "media_usage_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "paginate"/>
+      <enumeration value = "bounded-in-one-dimension"/>
+      <enumeration value = "unbounded"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "rendering_intent_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "perceptual"/>
+      <enumeration value = "relative-colorimetric"/>
+      <enumeration value = "saturation"/>
+      <enumeration value = "absolute-colorimetric"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "hyphenate_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "false"/>
+      <enumeration value = "true"/>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "suppress_at_line_break_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "suppress"/>
+      <enumeration value = "retain"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "treat_as_word_space_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "dominant_baseline_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "use-script"/>
+      <enumeration value = "no-change"/>
+      <enumeration value = "reset-size"/>
+      <enumeration value = "ideographic"/>
+      <enumeration value = "alphabetic"/>
+      <enumeration value = "hanging"/>
+      <enumeration value = "mathematical"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "orientation_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "inherit"/>
+      <enumeration value = "0"/>
+      <enumeration value = "90"/>
+      <enumeration value = "180"/>
+      <enumeration value = "270"/>
+      <enumeration value = "-90"/>
+      <enumeration value = "-180"/>
+      <enumeration value = "-270"/>
+      <enumeration value = "0deg"/>
+      <enumeration value = "90deg"/>
+      <enumeration value = "180deg"/>
+      <enumeration value = "270deg"/>
+      <enumeration value = "-90deg"/>
+      <enumeration value = "-180deg"/>
+      <enumeration value = "-270deg"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "measurement_Type">
+    <annotation>
+      <documentation>
+        Here to document the acceptable measurements 
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <enumeration value = "px"/>
+      <enumeration value = "pt"/>
+      <enumeration value = "mm"/>
+      <enumeration value = "in"/>
+      <enumeration value = "cm"/>
+      <enumeration value = "em"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "positive_length_Type">
+    <restriction base = "string">
+      <pattern value = "\+?\d+\.?\d*(px|pt|mm|cm|in|em|%)"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "negative_length_Type">
+    <restriction base = "string">
+      <pattern value = "-\d+\.?\d*(px|pt|mm|cm|in|em|%)"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "integer_Force_Type">
+    <restriction base = "string">
+      <pattern value = "([0-9]+|force)"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "padding_top_Type">
+    <union memberTypes = "fo:width_Type fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "padding_before_Type">
+    <union memberTypes = "fo:width_Type fo:length_Type fo:length_conditional_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "country_Type">
+    <annotation>
+      <documentation>
+        A string of characters conforming to an ISO 3166 country code. 
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "none"/>
+      <enumeration value = "inherit"/>
+      <enumeration value = "AF"><annotation><documentation> country-name = "AFGHANISTAN"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "AL"><annotation><documentation> country-name = "ALBANIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "DZ"><annotation><documentation> country-name = "ALGERIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "AS"><annotation><documentation> country-name = "AMERICANSAMOA"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "AD"><annotation><documentation> country-name = "ANDORRA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "AO"><annotation><documentation> country-name = "ANGOLA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "AI"><annotation><documentation> country-name = "ANGUILLA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "AQ"><annotation><documentation> country-name = "ANTARCTICA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "AG"><annotation><documentation> country-name = "ANTIGUAANDBARBUDA"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "AR"><annotation><documentation> country-name = "ARGENTINA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "AM"><annotation><documentation> country-name = "ARMENIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "AW"><annotation><documentation> country-name = "ARUBA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "AU"><annotation><documentation> country-name = "AUSTRALIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "AT"><annotation><documentation> country-name = "AUSTRIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "AZ"><annotation><documentation> country-name = "AZERBAIJAN"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "BS"><annotation><documentation> country-name = "BAHAMAS"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "BH"><annotation><documentation> country-name = "BAHRAIN"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "BD"><annotation><documentation> country-name = "BANGLADESH"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "BB"><annotation><documentation> country-name = "BARBADOS"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "BY"><annotation><documentation> country-name = "BELARUS"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "BE"><annotation><documentation> country-name = "BELGIUM"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "BZ"><annotation><documentation> country-name = "BELIZE"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "BJ"><annotation><documentation> country-name = "BENIN"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "BM"><annotation><documentation> country-name = "BERMUDA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "BT"><annotation><documentation> country-name = "BHUTAN"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "BO"><annotation><documentation> country-name = "BOLIVIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "BA"><annotation><documentation> country-name = "BOSNIAANDHERZEGOVINA"/ </documentation></annotation>            </enumeration>
+      <enumeration value = "BW"><annotation><documentation> country-name = "BOTSWANA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "BV"><annotation><documentation> country-name = "BOUVETISLAND"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "BR"><annotation><documentation> country-name = "BRAZIL"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "IO"><annotation><documentation> country-name = "BRITISHINDIANOCEANTERRITORY"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "BN"><annotation><documentation> country-name = "BRUNEIDARUSSALAM"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "BG"><annotation><documentation> country-name = "BULGARIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "BF"><annotation><documentation> country-name = "BURKINAFASO"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "BI"><annotation><documentation> country-name = "BURUNDI"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "KH"><annotation><documentation> country-name = "CAMBODIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "CM"><annotation><documentation> country-name = "CAMEROON"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "CA"><annotation><documentation> country-name = "CANADA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "CV"><annotation><documentation> country-name = "CAPEVERDE"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "KY"><annotation><documentation> country-name = "CAYMANISLANDS"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "CF"><annotation><documentation> country-name = "CENTRALAFRICANREPUBLIC"/ </documentation></annotation>            </enumeration>
+      <enumeration value = "TD"><annotation><documentation> country-name = "CHAD"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "CL"><annotation><documentation> country-name = "CHILE"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "CN"><annotation><documentation> country-name = "CHINA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "CX"><annotation><documentation> country-name = "CHRISTMASISLAND"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "CC"><annotation><documentation> country-name = "COCOS(KEELING)ISLANDS"/ </documentation></annotation>           </enumeration>
+      <enumeration value = "CO"><annotation><documentation> country-name = "COLOMBIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "KM"><annotation><documentation> country-name = "COMOROS"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "CG"><annotation><documentation> country-name = "CONGO"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "CD"><annotation><documentation> country-name = "CONGO,THEDEMOCRATICREPUBLICOFTHE"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "CK"><annotation><documentation> country-name = "COOKISLANDS"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "CR"><annotation><documentation> country-name = "COSTARICA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "CI"><annotation><documentation> country-name = "COTED'IVOIRE"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "HR"><annotation><documentation> country-name = "CROATIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "CU"><annotation><documentation> country-name = "CUBA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "CY"><annotation><documentation> country-name = "CYPRUS"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "CZ"><annotation><documentation> country-name = "CZECHREPUBLIC"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "DK"><annotation><documentation> country-name = "DENMARK"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "DJ"><annotation><documentation> country-name = "DJIBOUTI"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "DM"><annotation><documentation> country-name = "DOMINICA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "DO"><annotation><documentation> country-name = "DOMINICANREPUBLIC"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "TP"><annotation><documentation> country-name = "EASTTIMOR"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "EC"><annotation><documentation> country-name = "ECUADOR"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "EG"><annotation><documentation> country-name = "EGYPT"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "SV"><annotation><documentation> country-name = "ELSALVADOR"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "GQ"><annotation><documentation> country-name = "EQUATORIALGUINEA"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "ER"><annotation><documentation> country-name = "ERITREA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "EE"><annotation><documentation> country-name = "ESTONIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "ET"><annotation><documentation> country-name = "ETHIOPIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "FK"><annotation><documentation> country-name = "FALKLANDISLANDS(MALVINAS)"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "FO"><annotation><documentation> country-name = "FAROEISLANDS"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "FJ"><annotation><documentation> country-name = "FIJI"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "FI"><annotation><documentation> country-name = "FINLAND"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "FR"><annotation><documentation> country-name = "FRANCE"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "GF"><annotation><documentation> country-name = "FRENCHGUIANA"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "PF"><annotation><documentation> country-name = "FRENCHPOLYNESIA"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "TF"><annotation><documentation> country-name = "FRENCHSOUTHERNTERRITORIES"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "GA"><annotation><documentation> country-name = "GABON"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "GM"><annotation><documentation> country-name = "GAMBIA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "GE"><annotation><documentation> country-name = "GEORGIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "DE"><annotation><documentation> country-name = "GERMANY"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "GH"><annotation><documentation> country-name = "GHANA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "GI"><annotation><documentation> country-name = "GIBRALTAR"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "GR"><annotation><documentation> country-name = "GREECE"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "GL"><annotation><documentation> country-name = "GREENLAND"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "GD"><annotation><documentation> country-name = "GRENADA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "GP"><annotation><documentation> country-name = "GUADELOUPE"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "GU"><annotation><documentation> country-name = "GUAM"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "GT"><annotation><documentation> country-name = "GUATEMALA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "GN"><annotation><documentation> country-name = "GUINEA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "GW"><annotation><documentation> country-name = "GUINEA-BISSAU"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "GY"><annotation><documentation> country-name = "GUYANA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "HT"><annotation><documentation> country-name = "HAITI"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "HM"><annotation><documentation> country-name = "HEARDISLANDANDMCDONALDISLANDS"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "VA"><annotation><documentation> country-name = "HOLYSEE(VATICANCITYSTATE)"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "HN"><annotation><documentation> country-name = "HONDURAS"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "HK"><annotation><documentation> country-name = "HONGKONG"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "HU"><annotation><documentation> country-name = "HUNGARY"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "IS"><annotation><documentation> country-name = "ICELAND"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "IN"><annotation><documentation> country-name = "INDIA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "ID"><annotation><documentation> country-name = "INDONESIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "IR"><annotation><documentation> country-name = "IRAN,ISLAMICREPUBLICOF"/ </documentation></annotation>            </enumeration>
+      <enumeration value = "IQ"><annotation><documentation> country-name = "IRAQ"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "IE"><annotation><documentation> country-name = "IRELAND"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "IL"><annotation><documentation> country-name = "ISRAEL"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "IT"><annotation><documentation> country-name = "ITALY"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "JM"><annotation><documentation> country-name = "JAMAICA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "JP"><annotation><documentation> country-name = "JAPAN"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "JO"><annotation><documentation> country-name = "JORDAN"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "KZ"><annotation><documentation> country-name = "KAZAKSTAN"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "KE"><annotation><documentation> country-name = "KENYA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "KI"><annotation><documentation> country-name = "KIRIBATI"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "KP"><annotation><documentation> country-name = "KOREA,DEMOCRATICPEOPLE'SREPUBLICOF"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "KR"><annotation><documentation> country-name = "KOREA,REPUBLICOF"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "KW"><annotation><documentation> country-name = "KUWAIT"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "KG"><annotation><documentation> country-name = "KYRGYZSTAN"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "LA"><annotation><documentation> country-name = "LAOPEOPLE'SDEMOCRATICREPUBLIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "LV"><annotation><documentation> country-name = "LATVIA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "LB"><annotation><documentation> country-name = "LEBANON"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "LS"><annotation><documentation> country-name = "LESOTHO"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "LR"><annotation><documentation> country-name = "LIBERIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "LY"><annotation><documentation> country-name = "LIBYANARABJAMAHIRIYA"/ </documentation></annotation>            </enumeration>
+      <enumeration value = "LI"><annotation><documentation> country-name = "LIECHTENSTEIN"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "LT"><annotation><documentation> country-name = "LITHUANIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "LU"><annotation><documentation> country-name = "LUXEMBOURG"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MO"><annotation><documentation> country-name = "MACAU"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "MK"><annotation><documentation> country-name = "MACEDONIA,THEFORMERYUGOSLAVREPUBLICOF"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "MG"><annotation><documentation> country-name = "MADAGASCAR"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MW"><annotation><documentation> country-name = "MALAWI"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "MY"><annotation><documentation> country-name = "MALAYSIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MV"><annotation><documentation> country-name = "MALDIVES"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "ML"><annotation><documentation> country-name = "MALI"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "MT"><annotation><documentation> country-name = "MALTA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "MH"><annotation><documentation> country-name = "MARSHALLISLANDS"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "MQ"><annotation><documentation> country-name = "MARTINIQUE"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MR"><annotation><documentation> country-name = "MAURITANIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MU"><annotation><documentation> country-name = "MAURITIUS"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "YT"><annotation><documentation> country-name = "MAYOTTE"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "MX"><annotation><documentation> country-name = "MEXICO"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "FM"><annotation><documentation> country-name = "MICRONESIA,FEDERATEDSTATESOF"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "MD"><annotation><documentation> country-name = "MOLDOVA,REPUBLICOF"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "MC"><annotation><documentation> country-name = "MONACO"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "MN"><annotation><documentation> country-name = "MONGOLIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MS"><annotation><documentation> country-name = "MONTSERRAT"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MA"><annotation><documentation> country-name = "MOROCCO"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "MZ"><annotation><documentation> country-name = "MOZAMBIQUE"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "MM"><annotation><documentation> country-name = "MYANMAR"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "NA"><annotation><documentation> country-name = "NAMIBIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "NR"><annotation><documentation> country-name = "NAURU"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "NP"><annotation><documentation> country-name = "NEPAL"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "NL"><annotation><documentation> country-name = "NETHERLANDS"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "AN"><annotation><documentation> country-name = "NETHERLANDSANTILLES"/ </documentation></annotation>           </enumeration>
+      <enumeration value = "NC"><annotation><documentation> country-name = "NEWCALEDONIA"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "NZ"><annotation><documentation> country-name = "NEWZEALAND"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "NI"><annotation><documentation> country-name = "NICARAGUA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "NE"><annotation><documentation> country-name = "NIGER"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "NG"><annotation><documentation> country-name = "NIGERIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "NU"><annotation><documentation> country-name = "NIUE"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "NF"><annotation><documentation> country-name = "NORFOLKISLAND"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "MP"><annotation><documentation> country-name = "NORTHERNMARIANAISLANDS"/ </documentation></annotation>            </enumeration>
+      <enumeration value = "NO"><annotation><documentation> country-name = "NORWAY"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "OM"><annotation><documentation> country-name = "OMAN"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "PK"><annotation><documentation> country-name = "PAKISTAN"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "PW"><annotation><documentation> country-name = "PALAU"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "PS"><annotation><documentation> country-name = "PALESTINIANTERRITORY,OCCUPIED"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "PA"><annotation><documentation> country-name = "PANAMA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "PG"><annotation><documentation> country-name = "PAPUANEWGUINEA"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "PY"><annotation><documentation> country-name = "PARAGUAY"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "PE"><annotation><documentation> country-name = "PERU"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "PH"><annotation><documentation> country-name = "PHILIPPINES"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "PN"><annotation><documentation> country-name = "PITCAIRN"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "PL"><annotation><documentation> country-name = "POLAND"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "PT"><annotation><documentation> country-name = "PORTUGAL"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "PR"><annotation><documentation> country-name = "PUERTORICO"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "QA"><annotation><documentation> country-name = "QATAR"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "RE"><annotation><documentation> country-name = "R+UNION"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "RO"><annotation><documentation> country-name = "ROMANIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "RU"><annotation><documentation> country-name = "RUSSIANFEDERATION"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "RW"><annotation><documentation> country-name = "RWANDA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "SH"><annotation><documentation> country-name = "SAINTHELENA"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "KN"><annotation><documentation> country-name = "SAINTKITTSANDNEVIS"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "LC"><annotation><documentation> country-name = "SAINTLUCIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "PM"><annotation><documentation> country-name = "SAINTPIERREANDMIQUELON"/ </documentation></annotation>            </enumeration>
+      <enumeration value = "VC"><annotation><documentation> country-name = "SAINTVINCENTANDTHEGRENADINES"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "WS"><annotation><documentation> country-name = "SAMOA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "SM"><annotation><documentation> country-name = "SANMARINO"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "ST"><annotation><documentation> country-name = "SAOTOMEANDPRINCIPE"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "SA"><annotation><documentation> country-name = "SAUDIARABIA"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "SN"><annotation><documentation> country-name = "SENEGAL"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "SC"><annotation><documentation> country-name = "SEYCHELLES"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "SL"><annotation><documentation> country-name = "SIERRALEONE"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "SG"><annotation><documentation> country-name = "SINGAPORE"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "SK"><annotation><documentation> country-name = "SLOVAKIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "SI"><annotation><documentation> country-name = "SLOVENIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "SB"><annotation><documentation> country-name = "SOLOMONISLANDS"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "SO"><annotation><documentation> country-name = "SOMALIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "ZA"><annotation><documentation> country-name = "SOUTHAFRICA"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "GS"><annotation><documentation> country-name = "SOUTHGEORGIAANDTHESOUTHSANDWICHISLANDS"/ </documentation></annotation>    </enumeration>
+      <enumeration value = "ES"><annotation><documentation> country-name = "SPAIN"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "LK"><annotation><documentation> country-name = "SRILANKA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "SD"><annotation><documentation> country-name = "SUDAN"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "SR"><annotation><documentation> country-name = "SURINAME"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "SJ"><annotation><documentation> country-name = "SVALBARDANDJANMAYEN"/ </documentation></annotation>           </enumeration>
+      <enumeration value = "SZ"><annotation><documentation> country-name = "SWAZILAND"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "SE"><annotation><documentation> country-name = "SWEDEN"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "CH"><annotation><documentation> country-name = "SWITZERLAND"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "SY"><annotation><documentation> country-name = "SYRIANARABREPUBLIC"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "TW"><annotation><documentation> country-name = "TAIWAN,PROVINCEOFCHINA"/ </documentation></annotation>            </enumeration>
+      <enumeration value = "TJ"><annotation><documentation> country-name = "TAJIKISTAN"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "TZ"><annotation><documentation> country-name = "TANZANIA,UNITEDREPUBLICOF"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "TH"><annotation><documentation> country-name = "THAILAND"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "TG"><annotation><documentation> country-name = "TOGO"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "TK"><annotation><documentation> country-name = "TOKELAU"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "TO"><annotation><documentation> country-name = "TONGA"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "TT"><annotation><documentation> country-name = "TRINIDADANDTOBAGO"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "TN"><annotation><documentation> country-name = "TUNISIA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "TR"><annotation><documentation> country-name = "TURKEY"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "TM"><annotation><documentation> country-name = "TURKMENISTAN"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "TC"><annotation><documentation> country-name = "TURKSANDCAICOSISLANDS"/ </documentation></annotation>           </enumeration>
+      <enumeration value = "TV"><annotation><documentation> country-name = "TUVALU"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "UG"><annotation><documentation> country-name = "UGANDA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "UA"><annotation><documentation> country-name = "UKRAINE"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "AE"><annotation><documentation> country-name = "UNITEDARABEMIRATES"/ </documentation></annotation>              </enumeration>
+      <enumeration value = "GB"><annotation><documentation> country-name = "UNITEDKINGDOM"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "US"><annotation><documentation> country-name = "UNITEDSTATES"/ </documentation></annotation>                </enumeration>
+      <enumeration value = "UM"><annotation><documentation> country-name = "UNITEDSTATESMINOROUTLYINGISLANDS"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "UY"><annotation><documentation> country-name = "URUGUAY"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "UZ"><annotation><documentation> country-name = "UZBEKISTAN"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "VU"><annotation><documentation> country-name = "VANUATU"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "VE"><annotation><documentation> country-name = "VENEZUELA"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "VN"><annotation><documentation> country-name = "VIETNAM"/ </documentation></annotation>                 </enumeration>
+      <enumeration value = "VG"><annotation><documentation> country-name = "VIRGINISLANDS,BRITISH"/ </documentation></annotation>           </enumeration>
+      <enumeration value = "VI"><annotation><documentation> country-name = "VIRGINISLANDS,U.S."/ </documentation></annotation>              </enumeration>
+      <enumeration value = "WF"><annotation><documentation> country-name = "WALLISANDFUTUNA"/ </documentation></annotation>             </enumeration>
+      <enumeration value = "EH"><annotation><documentation> country-name = "WESTERNSAHARA"/ </documentation></annotation>               </enumeration>
+      <enumeration value = "YE"><annotation><documentation> country-name = "YEMEN"/ </documentation></annotation>                   </enumeration>
+      <enumeration value = "YU"><annotation><documentation> country-name = "YUGOSLAVIA"/ </documentation></annotation>                  </enumeration>
+      <enumeration value = "ZM"><annotation><documentation> country-name = "ZAMBIA"/ </documentation></annotation>                    </enumeration>
+      <enumeration value = "ZW"><annotation><documentation> country-name = "ZIMBABWE"/ </documentation></annotation>                  </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "language_Type">
+  <annotation><documentation> A string of characters conforming to the ISO 639 3-letter code. (Rather odd since all of them have 2 letters)</documentation></annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "none"/>
+      <enumeration value = "inherit"/>
+      <enumeration value = "AY"><annotation><documentation> language-name = "AYMARA" language-family = "AMERINDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "GN"><annotation><documentation> language-name = "GUARANI" language-family = "AMERINDIAN"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "QU"><annotation><documentation> language-name = "QUECHUA" language-family = "AMERINDIAN"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "DZ"><annotation><documentation> language-name = "BHUTANI" language-family = "ASIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "MY"><annotation><documentation> language-name = "BURMESE" language-family = "ASIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "KM"><annotation><documentation> language-name = "CAMBODIAN" language-family = "ASIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "ZH"><annotation><documentation> language-name = "CHINESE" language-family = "ASIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "JA"><annotation><documentation> language-name = "JAPANESE" language-family = "ASIAN"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "KO"><annotation><documentation> language-name = "KOREAN" language-family = "ASIAN"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "LO"><annotation><documentation> language-name = "LAOTHIAN" language-family = "ASIAN"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "TH"><annotation><documentation> language-name = "THAI" language-family = "ASIAN"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "BO"><annotation><documentation> language-name = "TIBETAN" language-family = "ASIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "VI"><annotation><documentation> language-name = "VIETNAMESE" language-family = "ASIAN"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "LV"><annotation><documentation> language-name = "LATVIAN;LETTISH" language-family = "BALTIC"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "LT"><annotation><documentation> language-name = "LITHUANIAN" language-family = "BALTIC"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "EU"><annotation><documentation> language-name = "BASQUE" language-family = "BASQUE"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "BR"><annotation><documentation> language-name = "BRETON" language-family = "CELTIC"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "GA"><annotation><documentation> language-name = "IRISH" language-family = "CELTIC"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "GD"><annotation><documentation> language-name = "SCOTS-GAELIC" language-family = "CELTIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "CY"><annotation><documentation> language-name = "WELSH" language-family = "CELTIC"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "KN"><annotation><documentation> language-name = "KANNADA" language-family = "DRAVIDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "ML"><annotation><documentation> language-name = "MALAYALAM" language-family = "DRAVIDIAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "TA"><annotation><documentation> language-name = "TAMIL" language-family = "DRAVIDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "TE"><annotation><documentation> language-name = "TELUGU" language-family = "DRAVIDIAN"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "KL"><annotation><documentation> language-name = "GREENLANDIC" language-family = "ESKIMO"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "IK"><annotation><documentation> language-name = "INUPIAK" language-family = "ESKIMO"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "ET"><annotation><documentation> language-name = "ESTONIAN" language-family = "FINNO-UGRIC"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "FI"><annotation><documentation> language-name = "FINNISH" language-family = "FINNO-UGRIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "HU"><annotation><documentation> language-name = "HUNGARIAN" language-family = "FINNO-UGRIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "AF"><annotation><documentation> language-name = "AFRIKAANS" language-family = "GERMANIC"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "DA"><annotation><documentation> language-name = "DANISH" language-family = "GERMANIC"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "NL"><annotation><documentation> language-name = "DUTCH" language-family = "GERMANIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "EN"><annotation><documentation> language-name = "ENGLISH" language-family = "GERMANIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "FO"><annotation><documentation> language-name = "FAROESE" language-family = "GERMANIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "FY"><annotation><documentation> language-name = "FRISIAN" language-family = "GERMANIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "DE"><annotation><documentation> language-name = "GERMAN" language-family = "GERMANIC"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "IS"><annotation><documentation> language-name = "ICELANDIC" language-family = "GERMANIC"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "NO"><annotation><documentation> language-name = "NORWEGIAN" language-family = "GERMANIC"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "SV"><annotation><documentation> language-name = "SWEDISH" language-family = "GERMANIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "YI"><annotation><documentation> language-name = "YIDDISH" language-family = "GERMANIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "OM"><annotation><documentation> language-name = "AFAN-(OROMO)" language-family = "HAMITIC"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "AA"><annotation><documentation> language-name = "AFAR" language-family = "HAMITIC"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "SO"><annotation><documentation> language-name = "SOMALI" language-family = "HAMITIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "AB"><annotation><documentation> language-name = "ABKHAZIAN" language-family = "IBERO-CAUCASIAN"/ </documentation></annotation>    </enumeration>
+      <enumeration value = "KA"><annotation><documentation> language-name = "GEORGIAN" language-family = "IBERO-CAUCASIAN"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "AS"><annotation><documentation> language-name = "ASSAMESE" language-family = "INDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "BN"><annotation><documentation> language-name = "BENGALI;BANGLA" language-family = "INDIAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "BH"><annotation><documentation> language-name = "BIHARI" language-family = "INDIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "GU"><annotation><documentation> language-name = "GUJARATI" language-family = "INDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "HI"><annotation><documentation> language-name = "HINDI" language-family = "INDIAN"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "KS"><annotation><documentation> language-name = "KASHMIRI" language-family = "INDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "MR"><annotation><documentation> language-name = "MARATHI" language-family = "INDIAN"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "NE"><annotation><documentation> language-name = "NEPALI" language-family = "INDIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "OR"><annotation><documentation> language-name = "ORIYA" language-family = "INDIAN"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "PA"><annotation><documentation> language-name = "PUNJABI" language-family = "INDIAN"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "SA"><annotation><documentation> language-name = "SANSKRIT" language-family = "INDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "SD"><annotation><documentation> language-name = "SINDHI" language-family = "INDIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "SI"><annotation><documentation> language-name = "SINGHALESE" language-family = "INDIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "UR"><annotation><documentation> language-name = "URDU" language-family = "INDIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "SQ"><annotation><documentation> language-name = "ALBANIAN" language-family = "INDO-EUROPEAN(OTHER)"/ </documentation></annotation>  </enumeration>
+      <enumeration value = "HY"><annotation><documentation> language-name = "ARMENIAN" language-family = "INDO-EUROPEAN(OTHER)"/ </documentation></annotation>  </enumeration>
+      <enumeration value = "EO"><annotation><documentation> language-name = "ESPERANTO" language-family = "INTERNATIONAL-AUX."/ </documentation></annotation> </enumeration>
+      <enumeration value = "IA"><annotation><documentation> language-name = "INTERLINGUA" language-family = "INTERNATIONAL-AUX."/ </documentation></annotation> </enumeration>
+      <enumeration value = "IE"><annotation><documentation> language-name = "INTERLINGUE" language-family = "INTERNATIONAL-AUX."/ </documentation></annotation> </enumeration>
+      <enumeration value = "VO"><annotation><documentation> language-name = "VOLAPUK" language-family = "INTERNATIONAL-AUX."/ </documentation></annotation> </enumeration>
+      <enumeration value = "KU"><annotation><documentation> language-name = "KURDISH" language-family = "IRANIAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "PS"><annotation><documentation> language-name = "PASHTO;PUSHTO" language-family = "IRANIAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "FA"><annotation><documentation> language-name = "PERSIAN-(farsi)" language-family = "IRANIAN"/ </documentation></annotation>    </enumeration>
+      <enumeration value = "TG"><annotation><documentation> language-name = "TAJIK" language-family = "IRANIAN"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "EL"><annotation><documentation> language-name = "GREEK" language-family = "LATIN/GREEK"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "LA"><annotation><documentation> language-name = "LATIN" language-family = "LATIN/GREEK"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "HA"><annotation><documentation> language-name = "HAUSA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "RW"><annotation><documentation> language-name = "KINYARWANDA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>    </enumeration>
+      <enumeration value = "RN"><annotation><documentation> language-name = "KURUNDI" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "LN"><annotation><documentation> language-name = "LINGALA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "SG"><annotation><documentation> language-name = "SANGHO" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "ST"><annotation><documentation> language-name = "SESOTHO" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "TN"><annotation><documentation> language-name = "SETSWANA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "SN"><annotation><documentation> language-name = "SHONA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "SS"><annotation><documentation> language-name = "SISWATI" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "SW"><annotation><documentation> language-name = "SWAHILI" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "TS"><annotation><documentation> language-name = "TSONGA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "TW"><annotation><documentation> language-name = "TWI" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "WO"><annotation><documentation> language-name = "WOLOF" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "XH"><annotation><documentation> language-name = "XHOSA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "YO"><annotation><documentation> language-name = "YORUBA" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "ZU"><annotation><documentation> language-name = "ZULU" language-family = "NEGRO-AFRICAN"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "FJ"><annotation><documentation> language-name = "FIJI" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>    </enumeration>
+      <enumeration value = "ID"><annotation><documentation> language-name = "INDONESIAN" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>  </enumeration>
+      <enumeration value = "JV"><annotation><documentation> language-name = "JAVANESE" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>  </enumeration>
+      <enumeration value = "MG"><annotation><documentation> language-name = "MALAGASY" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>  </enumeration>
+      <enumeration value = "MS"><annotation><documentation> language-name = "MALAY" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "MI"><annotation><documentation> language-name = "MAORI" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "SM"><annotation><documentation> language-name = "SAMOAN" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>    </enumeration>
+      <enumeration value = "SU"><annotation><documentation> language-name = "SUNDANESE" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation> </enumeration>
+      <enumeration value = "TL"><annotation><documentation> language-name = "TAGALOG" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation> </enumeration>
+      <enumeration value = "TO"><annotation><documentation> language-name = "TONGA" language-family = "OCEANIC/INDONESIAN"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "CA"><annotation><documentation> language-name = "CATALAN" language-family = "ROMANCE"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "CO"><annotation><documentation> language-name = "CORSICAN" language-family = "ROMANCE"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "FR"><annotation><documentation> language-name = "FRENCH" language-family = "ROMANCE"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "GL"><annotation><documentation> language-name = "GALICIAN" language-family = "ROMANCE"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "IT"><annotation><documentation> language-name = "ITALIAN" language-family = "ROMANCE"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "MO"><annotation><documentation> language-name = "MOLDAVIAN" language-family = "ROMANCE"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "OC"><annotation><documentation> language-name = "OCCITAN" language-family = "ROMANCE"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "PT"><annotation><documentation> language-name = "PORTUGUESE" language-family = "ROMANCE"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "RM"><annotation><documentation> language-name = "RHAETO-ROMANCE" language-family = "ROMANCE"/ </documentation></annotation>   </enumeration>
+      <enumeration value = "RO"><annotation><documentation> language-name = "ROMANIAN" language-family = "ROMANCE"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "ES"><annotation><documentation> language-name = "SPANISH" language-family = "ROMANCE"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "AM"><annotation><documentation> language-name = "AMHARIC" language-family = "SEMITIC"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "AR"><annotation><documentation> language-name = "ARABIC" language-family = "SEMITIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "HE"><annotation><documentation> language-name = "HEBREW" language-family = "SEMITIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "MT"><annotation><documentation> language-name = "MALTESE" language-family = "SEMITIC"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "TI"><annotation><documentation> language-name = "TIGRINYA" language-family = "SEMITIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "BG"><annotation><documentation> language-name = "BULGARIAN" language-family = "SLAVIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "BE"><annotation><documentation> language-name = "BYELORUSSIAN" language-family = "SLAVIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "HR"><annotation><documentation> language-name = "CROATIAN" language-family = "SLAVIC"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "CS"><annotation><documentation> language-name = "CZECH" language-family = "SLAVIC"/ </documentation></annotation>         </enumeration>
+      <enumeration value = "MK"><annotation><documentation> language-name = "MACEDONIAN" language-family = "SLAVIC"/ </documentation></annotation>        </enumeration>
+      <enumeration value = "PL"><annotation><documentation> language-name = "POLISH" language-family = "SLAVIC"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "RU"><annotation><documentation> language-name = "RUSSIAN" language-family = "SLAVIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "SR"><annotation><documentation> language-name = "SERBIAN" language-family = "SLAVIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "SH"><annotation><documentation> language-name = "SERBO-CROATIAN" language-family = "SLAVIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "SK"><annotation><documentation> language-name = "SLOVAK" language-family = "SLAVIC"/ </documentation></annotation>          </enumeration>
+      <enumeration value = "SL"><annotation><documentation> language-name = "SLOVENIAN" language-family = "SLAVIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "UK"><annotation><documentation> language-name = "UKRAINIAN" language-family = "SLAVIC"/ </documentation></annotation>       </enumeration>
+      <enumeration value = "AZ"><annotation><documentation> language-name = "AZERBAIJANI" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>    </enumeration>
+      <enumeration value = "BA"><annotation><documentation> language-name = "BASHKIR" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "KK"><annotation><documentation> language-name = "KAZAKH" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>     </enumeration>
+      <enumeration value = "KY"><annotation><documentation> language-name = "KIRGHIZ" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "TT"><annotation><documentation> language-name = "TATAR" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "TR"><annotation><documentation> language-name = "TURKISH" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "TK"><annotation><documentation> language-name = "TURKMEN" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "UZ"><annotation><documentation> language-name = "UZBEK" language-family = "TURKIC/ALTAIC"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "BI"><annotation><documentation> language-name = "BISLAMA" language-family = "[not-given]"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "MN"><annotation><documentation> language-name = "MONGOLIAN" language-family = "[not-given]"/ </documentation></annotation>      </enumeration>
+      <enumeration value = "NA"><annotation><documentation> language-name = "NAURU" language-family = "[not-given]"/ </documentation></annotation>        </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "always_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "always"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "auto_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "baseline_base_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "baseline"/>
+      <enumeration value = "sub"/>
+      <enumeration value = "super"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "caption_side_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "before"/>
+      <enumeration value = "after"/>
+      <enumeration value = "start"/>
+      <enumeration value = "end"/>
+      <enumeration value = "top"/>
+      <enumeration value = "bottom"/>
+      <enumeration value = "left"/>
+      <enumeration value = "right"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "display_align_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "before"/>
+      <enumeration value = "center"/>
+      <enumeration value = "after"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "float_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "inherit"/>
+      <enumeration value = "before"/>
+      <enumeration value = "start"/>
+      <enumeration value = "end"/>
+      <enumeration value = "left"/>
+      <enumeration value = "right"/>
+      <enumeration value = "none"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "blank_or_not_blank_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "blank"/>
+      <enumeration value = "not-blank"/>
+      <enumeration value = "any"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "text_transform_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "capitalize"/>
+      <enumeration value = "uppercase"/>
+      <enumeration value = "lowercase"/>
+      <enumeration value = "none"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "border_collapse_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "collapse"/>
+      <enumeration value = "separate"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "line_height_shift_adjustment_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "consider-shifts"/>
+      <enumeration value = "disregard-shifts"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "white_space_collapse_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "false"/>
+      <enumeration value = "true"/>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "retrieve_position_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "first-starting-within-page"/>
+      <enumeration value = "first-including-carryover"/>
+      <enumeration value = "last-starting-within-page"/>
+      <enumeration value = "last-ending-within-page"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "page_position_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "first"/>
+      <enumeration value = "last"/>
+      <enumeration value = "rest"/>
+      <enumeration value = "any"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "force_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "force"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "white_space_treatment_Type">
+    <annotation>
+      <documentation>
+        <fop_fail>property ignored</fop_fail>
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "ignore"/>
+      <enumeration value = "preserve"/>
+      <enumeration value = "ignore-if-before-linefeed"/>
+      <enumeration value = "ignore-if-after-linefeed"/>
+      <enumeration value = "ignore-if-surrounding-linefeed"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "linefeed_treatment_Type">
+    <annotation>
+      <documentation>
+        <fop_fail>property is not implemented yet</fop_fail>
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "ignore"/>
+      <enumeration value = "preserve"/>
+      <enumeration value = "treat-as-space"/>
+      <enumeration value = "treat-as-zero-width-space"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "inherit_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "horizontal_position_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "left"/>
+      <enumeration value = "center"/>
+      <enumeration value = "right"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "line_stacking_strategy_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "line-height"/>
+      <enumeration value = "font-height"/>
+      <enumeration value = "max-height"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "active_state_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "link"/>
+      <enumeration value = "visited"/>
+      <enumeration value = "active"/>
+      <enumeration value = "hover"/>
+      <enumeration value = "focus"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "writing_mode_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "lr-tb"/>
+      <enumeration value = "rl-tb"/>
+      <enumeration value = "tb-rl"/>
+      <enumeration value = "lr"/>
+      <enumeration value = "rl"/>
+      <enumeration value = "tb"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "direction_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "ltr"/>
+      <enumeration value = "rtl"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "wrap_option_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "no-wrap"/>
+      <enumeration value = "wrap"/>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "span_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "none"/>
+      <enumeration value = "all"/>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "rule_style_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "none"/>
+      <enumeration value = "dotted"/>
+      <enumeration value = "dashed"/>
+      <enumeration value = "solid"/>
+      <enumeration value = "double"/>
+      <enumeration value = "groove"/>
+      <enumeration value = "ridge"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "border_style_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "none"/>
+      <enumeration value = "hidden"/>
+      <enumeration value = "dotted"/>
+      <enumeration value = "dashed"/>
+      <enumeration value = "solid"/>
+      <enumeration value = "double"/>
+      <enumeration value = "groove"/>
+      <enumeration value = "ridge"/>
+      <enumeration value = "inset"/>
+      <enumeration value = "outset"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "leader_alignment_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "none"/>
+      <enumeration value = "reference-area"/>
+      <enumeration value = "page"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "text_decoration_Type">
+    <annotation>
+      <documentation>
+        <fop_result>not implemented</fop_result>
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "none"/>
+      <enumeration value = "underline"/>
+      <enumeration value = "no-underline"/>
+      <enumeration value = "overline"/>
+      <enumeration value = "no-overline"/>
+      <enumeration value = "line-through"/>
+      <enumeration value = "no-line-through"/>
+      <enumeration value = "blink"/>
+      <enumeration value = "no-blink"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "unicode_bidi_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "normal"/>
+      <enumeration value = "embed"/>
+      <enumeration value = "bidi-override"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "odd_or_even_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "odd"/>
+      <enumeration value = "even"/>
+      <enumeration value = "any"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "once_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "once"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "retrieve_boundary_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "page"/>
+      <enumeration value = "page-sequence"/>
+      <enumeration value = "document"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "starting_state_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "show"/>
+      <enumeration value = "hide"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "leader_pattern_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "space"/>
+      <enumeration value = "rule"/>
+      <enumeration value = "dots"/>
+      <enumeration value = "use-content"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "text_align_last_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "start"/>
+      <enumeration value = "center"/>
+      <enumeration value = "end"/>
+      <enumeration value = "justify"/>
+      <enumeration value = "inside">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "outside">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "left">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "right">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "text_align_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "start"/>
+      <enumeration value = "center"/>
+      <enumeration value = "end"/>
+      <enumeration value = "justify"/>
+      <enumeration value = "inside">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "outside">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+      <enumeration value = "left"/>
+      <enumeration value = "right"/>
+      <enumeration value = "inherit">
+        <annotation>
+          <documentation>
+            <fop_fail>Unknown enumerated value</fop_fail>
+          </documentation>
+        </annotation>
+      </enumeration>
+    </restriction>
+  </simpleType>
+  <simpleType name = "width_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "thin"/>
+      <enumeration value = "medium"/>
+      <enumeration value = "thick"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "vertical_position_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "top"/>
+      <enumeration value = "center"/>
+      <enumeration value = "bottom"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "auto_restore_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "table_omit_footer_at_break_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "table_omit_header_at_break_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "precedence_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "score_spaces_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "true"/>
+      <enumeration value = "false"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "scaling_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "uniform"/>
+      <enumeration value = "non-uniform"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "use_font_metrics_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "use-font-metrics"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "background_image_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "uri-specification"/>
+      <enumeration value = "none"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "hyphenation_keep_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "column"/>
+      <enumeration value = "page"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "no_limit_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "no-limit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "visibility_Type">
+    <annotation>
+      <documentation>
+        <fop_fail>property is not implemented yet</fop_fail>
+      </documentation>
+    </annotation>
+    <restriction base = "NMTOKEN">
+      <enumeration value = "visible"/>
+      <enumeration value = "hidden"/>
+      <enumeration value = "collapse"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "overflow_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "visible"/>
+      <enumeration value = "hidden"/>
+      <enumeration value = "scroll"/>
+      <enumeration value = "error-if-overflow"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "transparent_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "transparent"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "none_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "none"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "absolute_position_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "absolute"/>
+      <enumeration value = "fixed"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "azimuth_base_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "left-side"/>
+      <enumeration value = "far-left"/>
+      <enumeration value = "left"/>
+      <enumeration value = "center-left"/>
+      <enumeration value = "center"/>
+      <enumeration value = "center-right"/>
+      <enumeration value = "right"/>
+      <enumeration value = "far-right"/>
+      <enumeration value = "right-side"/>
+      <enumeration value = "behind"/>
+      <enumeration value = "leftwards"/>
+      <enumeration value = "rightwards"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "azimuth_Type">
+    <union memberTypes = "fo:angle_Type fo:azimuth_base_Type"/>
+  </simpleType>
+  <simpleType name = "elevation_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "below"/>
+      <enumeration value = "level"/>
+      <enumeration value = "above"/>
+      <enumeration value = "higher"/>
+      <enumeration value = "lower"/>
+      <enumeration value = "0"/>
+      <enumeration value = "90"/>
+      <enumeration value = "180"/>
+      <enumeration value = "270"/>
+      <enumeration value = "0deg"/>
+      <enumeration value = "90deg"/>
+      <enumeration value = "180deg"/>
+      <enumeration value = "270deg"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "font_selection_strategy_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "auto"/>
+      <enumeration value = "character-by-character"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "font_stretch_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "normal"/>
+      <enumeration value = "wider"/>
+      <enumeration value = "narrower"/>
+      <enumeration value = "ultra-condensed"/>
+      <enumeration value = "extra-condensed"/>
+      <enumeration value = "condensed"/>
+      <enumeration value = "semi-condensed"/>
+      <enumeration value = "semi-expanded"/>
+      <enumeration value = "expanded"/>
+      <enumeration value = "extra-expanded"/>
+      <enumeration value = "ultra-expanded"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "clear_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "start"/>
+      <enumeration value = "end"/>
+      <enumeration value = "left"/>
+      <enumeration value = "right"/>
+      <enumeration value = "both"/>
+      <enumeration value = "none"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "color_Name_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "aliceblue"/>
+      <enumeration value = "antiquewhite"/>
+      <enumeration value = "aqua"/>
+      <enumeration value = "aquamarine"/>
+      <enumeration value = "azure"/>
+      <enumeration value = "beige"/>
+      <enumeration value = "bisque"/>
+      <enumeration value = "black"/>
+      <enumeration value = "blanchedalmond"/>
+      <enumeration value = "blue"/>
+      <enumeration value = "blueviolet"/>
+      <enumeration value = "brown"/>
+      <enumeration value = "burlywood"/>
+      <enumeration value = "cadetblue"/>
+      <enumeration value = "chartreuse"/>
+      <enumeration value = "chocolate"/>
+      <enumeration value = "coral"/>
+      <enumeration value = "cornflowerblue"/>
+      <enumeration value = "cornsilk"/>
+      <enumeration value = "crimson"/>
+      <enumeration value = "cyan"/>
+      <enumeration value = "darkblue"/>
+      <enumeration value = "darkcyan"/>
+      <enumeration value = "darkgoldenrod"/>
+      <enumeration value = "darkgray"/>
+      <enumeration value = "darkgreen"/>
+      <enumeration value = "darkgrey"/>
+      <enumeration value = "darkkhaki"/>
+      <enumeration value = "darkmagenta"/>
+      <enumeration value = "darkolivegreen"/>
+      <enumeration value = "darkorange"/>
+      <enumeration value = "darkorchid"/>
+      <enumeration value = "darkred"/>
+      <enumeration value = "darksalmon"/>
+      <enumeration value = "darkseagreen"/>
+      <enumeration value = "darkslateblue"/>
+      <enumeration value = "darkslategray"/>
+      <enumeration value = "darkslategrey"/>
+      <enumeration value = "darkturquoise"/>
+      <enumeration value = "darkviolet"/>
+      <enumeration value = "deeppink"/>
+      <enumeration value = "deepskyblue"/>
+      <enumeration value = "dimgray"/>
+      <enumeration value = "dimgrey"/>
+      <enumeration value = "dodgerblue"/>
+      <enumeration value = "firebrick"/>
+      <enumeration value = "floralwhite"/>
+      <enumeration value = "forestgreen"/>
+      <enumeration value = "fuchsia"/>
+      <enumeration value = "gainsboro"/>
+      <enumeration value = "lightpink"/>
+      <enumeration value = "lightsalmon"/>
+      <enumeration value = "lightseagreen"/>
+      <enumeration value = "lightskyblue"/>
+      <enumeration value = "lightslategray"/>
+      <enumeration value = "lightslategrey"/>
+      <enumeration value = "lightsteelblue"/>
+      <enumeration value = "lightyellow"/>
+      <enumeration value = "lime"/>
+      <enumeration value = "limegreen"/>
+      <enumeration value = "linen"/>
+      <enumeration value = "magenta"/>
+      <enumeration value = "maroon"/>
+      <enumeration value = "mediumaquamarine"/>
+      <enumeration value = "mediumblue"/>
+      <enumeration value = "mediumorchid"/>
+      <enumeration value = "mediumpurple"/>
+      <enumeration value = "mediumseagreen"/>
+      <enumeration value = "mediumslateblue"/>
+      <enumeration value = "mediumspringgreen"/>
+      <enumeration value = "mediumturquoise"/>
+      <enumeration value = "mediumvioletred"/>
+      <enumeration value = "midnightblue"/>
+      <enumeration value = "mintcream"/>
+      <enumeration value = "mistyrose"/>
+      <enumeration value = "moccasin"/>
+      <enumeration value = "navajowhite"/>
+      <enumeration value = "navy"/>
+      <enumeration value = "oldlace"/>
+      <enumeration value = "olive"/>
+      <enumeration value = "olivedrab"/>
+      <enumeration value = "orange"/>
+      <enumeration value = "orangered"/>
+      <enumeration value = "orchid"/>
+      <enumeration value = "palegoldenrod"/>
+      <enumeration value = "palegreen"/>
+      <enumeration value = "paleturquoise"/>
+      <enumeration value = "palevioletred"/>
+      <enumeration value = "papayawhip"/>
+      <enumeration value = "peachpuff"/>
+      <enumeration value = "peru"/>
+      <enumeration value = "pink"/>
+      <enumeration value = "plum"/>
+      <enumeration value = "powderblue"/>
+      <enumeration value = "purple"/>
+      <enumeration value = "red"/>
+      <enumeration value = "rosybrown"/>
+      <enumeration value = "royalblue"/>
+      <enumeration value = "saddlebrown"/>
+      <enumeration value = "salmon"/>
+      <enumeration value = "ghostwhite"/>
+      <enumeration value = "gold"/>
+      <enumeration value = "goldenrod"/>
+      <enumeration value = "gray"/>
+      <enumeration value = "grey"/>
+      <enumeration value = "green"/>
+      <enumeration value = "greenyellow"/>
+      <enumeration value = "honeydew"/>
+      <enumeration value = "hotpink"/>
+      <enumeration value = "indianred"/>
+      <enumeration value = "indigo"/>
+      <enumeration value = "ivory"/>
+      <enumeration value = "khaki"/>
+      <enumeration value = "lavender"/>
+      <enumeration value = "lavenderblush"/>
+      <enumeration value = "lawngreen"/>
+      <enumeration value = "lemonchiffon"/>
+      <enumeration value = "lightblue"/>
+      <enumeration value = "lightcoral"/>
+      <enumeration value = "lightcyan"/>
+      <enumeration value = "lightgoldenrodyellow"/>
+      <enumeration value = "lightgray"/>
+      <enumeration value = "lightgreen"/>
+      <enumeration value = "lightgrey"/>
+      <enumeration value = "sandybrown"/>
+      <enumeration value = "seagreen"/>
+      <enumeration value = "seashell"/>
+      <enumeration value = "sienna"/>
+      <enumeration value = "silver"/>
+      <enumeration value = "skyblue"/>
+      <enumeration value = "slateblue"/>
+      <enumeration value = "slategray"/>
+      <enumeration value = "slategrey"/>
+      <enumeration value = "snow"/>
+      <enumeration value = "springgreen"/>
+      <enumeration value = "steelblue"/>
+      <enumeration value = "tan"/>
+      <enumeration value = "teal"/>
+      <enumeration value = "thistle"/>
+      <enumeration value = "tomato"/>
+      <enumeration value = "turquoise"/>
+      <enumeration value = "violet"/>
+      <enumeration value = "wheat"/>
+      <enumeration value = "white"/>
+      <enumeration value = "whitesmoke"/>
+      <enumeration value = "yellow"/>
+      <enumeration value = "yellowgreen"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "color_Hex_Type">
+    <restriction base = "string">
+      <pattern value = "#[0-9A-F]{6}"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "background_color_Type">
+    <union memberTypes = "fo:color_Hex_Type fo:color_Name_Type fo:inherit_Type fo:transparent_Type"/>
+  </simpleType>
+  <simpleType name = "relative_position_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "static"/>
+      <enumeration value = "relative"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "speak_header_Type">
+    <restriction base = "NMTOKEN">
+      <enumeration value = "once"/>
+      <enumeration value = "always"/>
+      <enumeration value = "inherit"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "border_Type">
+    <annotation>
+      <documentation>
+        "fo:width_Type fo:border_style_Type fo:color_Type"
+        <enumeration value="solid 4px yellow"/>
+        <enumeration value="solid 2px green"/>
+        <enumeration value="solid 1px blue"/>
+        <enumeration value="solid 1px silver"/>
+      </documentation>
+    </annotation>
+    <restriction base = "string">
+      <pattern value = "(none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset) \+?\d+\.?\d*(px|pt|mm|cm|in|em|%) (#[0-9A-F]{6}|[a-z]{3,16})"/>
+    </restriction>
+  </simpleType>
+  <simpleType name = "font_size_Type">
+    <union memberTypes = "fo:absolute_size_Type fo:relative_size_Type fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "alignment_baseline_Type">
+    <union memberTypes = "fo:auto_Type fo:alignment_Type fo:box_alignment_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "alignment_adjust_Type">
+    <union memberTypes = "fo:auto_Type fo:alignment_Type fo:percentage_Type fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "z_index_Type">
+    <union memberTypes = "fo:auto_Type fo:integer_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "margin_width_Type">
+    <union memberTypes = "fo:auto_Type fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "block_progression_dimension_optimum_Type">
+    <union memberTypes = "fo:auto_Type fo:length_Type"/>
+  </simpleType>
+  <simpleType name = "block_progression_dimension_maximum_Type">
+    <union memberTypes = "fo:auto_Type fo:length_Type"/>
+  </simpleType>
+  <simpleType name = "inline_progression_dimension_maximum_Type">
+    <union memberTypes = "fo:auto_Type fo:length_Type"/>
+  </simpleType>
+  <simpleType name = "inline_progression_dimension_optimum_Type">
+    <union memberTypes = "fo:auto_Type fo:length_Type"/>
+  </simpleType>
+  <simpleType name = "baseline_shift_Type">
+    <union memberTypes = "fo:baseline_base_Type fo:percentage_Type fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_start_precedence_Type">
+    <union memberTypes = "fo:integer_Type fo:force_Type"/>
+  </simpleType>
+  <simpleType name = "space_end_precedence_Type">
+    <union memberTypes = "fo:integer_Type fo:force_Type"/>
+  </simpleType>
+  <simpleType name = "space_after_precedence_Type">
+    <union memberTypes = "fo:integer_Type fo:force_Type"/>
+  </simpleType>
+  <simpleType name = "space_before_precedence_Type">
+    <union memberTypes = "fo:integer_Type fo:force_Type"/>
+  </simpleType>
+  <simpleType name = "widows_Type">
+    <union memberTypes = "fo:integer_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "orphans_Type">
+    <union memberTypes = "fo:integer_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_start_maximum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_start_minimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_end_minimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_end_optimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_before_minimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_after_maximum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_start_optimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_end_maximum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_before_optimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_before_maximum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_after_optimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "space_after_minimum_Type">
+    <union memberTypes = "fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "left_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:auto_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "bottom_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:auto_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "right_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:auto_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "top_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:auto_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "start_indent_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "last_line_end_indent_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "provisional_distance_between_starts_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "end_indent_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "extent_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "provisional_label_separation_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "length_percentage_Type">
+    <union memberTypes = "fo:length_Type fo:percentage_Type"/>
+  </simpleType>
+  <simpleType name = "hyphenation_ladder_count_Type">
+    <union memberTypes = "fo:no_limit_Type fo:integer_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "background_position_horizontal_Type">
+    <union memberTypes = "fo:percentage_Type fo:length_Type fo:horizontal_position_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "background_position_vertical_Type">
+    <union memberTypes = "fo:percentage_Type fo:length_Type fo:vertical_position_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "leader_pattern_width_Type">
+    <union memberTypes = "fo:use_font_metrics_Type fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "text_altitude_Type">
+    <union memberTypes = "fo:use_font_metrics_Type fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "text_depth_Type">
+    <union memberTypes = "fo:use_font_metrics_Type fo:length_Type fo:percentage_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "border_before_width_Type">
+    <union memberTypes = "fo:width_Type fo:length_Type fo:length_conditional_Type fo:inherit_Type"/>
+  </simpleType>
+  <simpleType name = "border_top_width_Type">
+    <union memberTypes = "fo:width_Type fo:length_Type fo:inherit_Type"/>
+  </simpleType>
+  
+  <annotation>
+    <documentation>
+      Element definitions 
+    </documentation>
+  </annotation>
+  
+  <element name = "root">
+    <complexType>
+      <sequence>
+        <element ref = "fo:layout-master-set"/>
+        <element ref = "fo:declarations" minOccurs = "0"/>
+        <element ref = "fo:page-sequence" maxOccurs = "unbounded"/>
+      </sequence>
+      <attribute name = "media-usage" type = "fo:media_usage_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "declarations">
+    <complexType>
+      <sequence>
+        <element ref = "fo:color-profile" maxOccurs = "unbounded"/>
+        <any minOccurs = "0" maxOccurs = "unbounded" namespace = "##other" processContents = "skip"/>
+      </sequence>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "color-profile">
+    <complexType>
+      <attribute name = "src" type = "xs:string" use = "required"/>
+      <attribute name = "color-profile-name" type = "xs:string" use = "required"/>
+      <attribute name = "rendering-intent" type = "fo:rendering_intent_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "layout-master-set">
+    <complexType>
+      <choice maxOccurs = "unbounded">
+        <element ref = "fo:simple-page-master"/>
+        <element ref = "fo:page-sequence-master"/>
+      </choice>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "page-sequence-master">
+    <complexType>
+      <choice maxOccurs = "unbounded">
+        <element ref = "fo:single-page-master-reference"/>
+        <element ref = "fo:repeatable-page-master-reference"/>
+        <element ref = "fo:repeatable-page-master-alternatives"/>
+      </choice>
+      <attribute name = "master-name" type = "xs:string" use = "required"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "single-page-master-reference">
+    <complexType>
+      <attribute name = "master-reference" type = "xs:string" use = "required"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "repeatable-page-master-reference">
+    <complexType>
+      <attribute name = "master-reference" type = "xs:string" use = "required"/>
+      <attribute name = "maximum-repeats" type = "fo:integer_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "repeatable-page-master-alternatives">
+    <complexType>
+      <sequence>
+        <element ref = "fo:conditional-page-master-reference" maxOccurs = "unbounded"/>
+      </sequence>
+      <attribute name = "maximum-repeats" type = "fo:integer_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "conditional-page-master-reference">
+    <complexType>
+      <attribute name = "master-reference" type = "xs:string" use = "required"/>
+      <attribute name = "page-position" type = "fo:page_position_Type"/>
+      <attribute name = "odd-or-even" type = "fo:odd_or_even_Type"/>
+      <attribute name = "blank-or-not-blank" type = "fo:blank_or_not_blank_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "simple-page-master">
+    <complexType>
+      <sequence>
+        <element ref = "fo:region-body"/>
+        <element ref = "fo:region-before" minOccurs = "0"/>
+        <element ref = "fo:region-after" minOccurs = "0"/>
+        <element ref = "fo:region-start" minOccurs = "0"/>
+        <element ref = "fo:region-end" minOccurs = "0"/>
+      </sequence>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attribute name = "master-name" type = "xs:string" use = "required"/>
+      <attribute name = "page-height" type = "fo:length_Type"/>
+      <attribute name = "page-width" type = "fo:length_Type"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "region-body">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "display-align" type = "fo:display_align_Type"/> 
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "column-count" type = "fo:integer_Type"/>
+      <attribute name = "column-gap" type = "fo:length_Type"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attribute name = "region-name" type = "xs:string"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "region-before">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "display-align" type = "fo:display_align_Type"/> 
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "extent" type = "fo:extent_Type"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attribute name = "precedence" type = "fo:precedence_Type"/>
+      <attribute name = "region-name" type = "xs:string"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "region-after">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "display-align" type = "fo:display_align_Type"/> 
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "extent" type = "fo:extent_Type"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attribute name = "precedence" type = "fo:precedence_Type"/>
+      <attribute name = "region-name" type = "xs:string"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "region-start">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "display-align" type = "fo:display_align_Type"/> 
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "extent" type = "fo:extent_Type"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attribute name = "precedence" type = "fo:precedence_Type"/>
+      <attribute name = "region-name" type = "xs:string"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "region-end">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "display-align" type = "fo:display_align_Type"/> 
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "extent" type = "fo:extent_Type"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attribute name = "precedence" type = "fo:precedence_Type"/>
+      <attribute name = "region-name" type = "xs:string"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "page-sequence">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "country" type = "fo:country_Type"/> 
+          <attribute name = "language" type = "fo:language_Type"/>
+        </documentation>
+      </annotation>
+      <sequence>
+        <element ref = "fo:title" minOccurs = "0"/>
+        <element ref = "fo:static-content" minOccurs = "0" maxOccurs = "unbounded"/>
+        <element ref = "fo:flow"/>
+      </sequence>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "master-reference" type = "xs:string" use = "required"/>
+      <attribute name = "initial-page-number" type = "fo:integer_Type"/>
+      <attribute name = "force-page-count" type = "fo:force_page_count_Type"/>
+      <attribute name = "format" type = "xs:string"/>
+      <attribute name = "letter-value" type = "fo:letter_value_Type"/>
+      <attribute name = "grouping-separator" type = "fo:character_Type"/>
+      <attribute name = "grouping-size" type = "fo:integer_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "title">
+    <complexType mixed = "true">
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "color" type = "fo:color_Type"/>
+          <attribute name = "line-height" type = "fo:line_height_Type"/>
+          <attribute name = "visibility" type = "fo:visibility_Type"/>
+        </documentation>
+      </annotation>
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:neutral_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "static-content">
+    <complexType>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attribute name = "flow-name" type = "xs:string" use = "required"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "flow">
+    <complexType>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attribute name = "flow-name" type = "xs:string" use = "required"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "block">
+    <complexType mixed = "true">
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "color" type = "fo:color_Type"/>
+          <attribute name = "last-line-end-indent" type = "fo:last_line_end_indent_Type"/>
+          <attribute name = "linefeed-treatment" type = "fo:linefeed_treatment_Type"/>
+          <attribute name = "line-height" type = "fo:line_height_Type"/>
+          <attribute name = "orphans" type = "fo:orphans_Type"/>
+          <attribute name = "white-space-treatment" type = "fo:white_space_treatment_Type"/>
+          <attribute name = "text-align" type = "fo:text_align_Type"/>
+          <attribute name = "text-align-last" type = "fo:text_align_last_Type"/>
+          <attribute name = "text-indent" type = "fo:length_percentage_Type"/>
+          <attribute name = "visibility" type = "fo:visibility_Type"/>
+          <attribute name = "white-space-collapse" type = "fo:white_space_collapse_Type"/>
+          <attribute name = "widows" type = "fo:widows_Type"/>
+          <attribute name = "wrap-option" type = "fo:wrap_option_Type"/>
+        </documentation>
+      </annotation>
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:initial_property_set_List"/>
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:block_properties"/>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Hyphenation_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attributeGroup ref = "fo:break_Properties_List"/>
+      <attributeGroup ref = "fo:text_one_Properties_List"/>
+      <attributeGroup ref = "fo:block_hyphenation_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:intrusion_displace_Properties_List"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attributeGroup ref = "fo:line_height_Properties_List"/>
+      <attribute name = "span" type = "fo:span_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "block-container">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "display-align" type = "fo:display_align_Type"/> 
+        </documentation>
+      </annotation>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:block_properties"/>
+      <attributeGroup ref = "fo:Absolute_Position_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attributeGroup ref = "fo:break_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:intrusion_displace_Properties_List"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attribute name = "span" type = "fo:span_Type"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attribute name = "z-index" type = "fo:z_index_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "bidi-override">
+    <complexType mixed = "true">
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "color" type = "fo:color_Type"/> 
+          <attribute name = "direction" type = "fo:direction_Type"/> 
+          <attribute name = "letter-spacing" type = "fo:letter_spacing_Type"/>
+          <attribute name = "line-height" type = "fo:line_height_Type"/> 
+          <attribute name = "score-spaces" type = "fo:score_spaces_Type"/> 
+          <attribute name = "word-spacing" type = "fo:letter_spacing_Type"/> 
+        </documentation>
+      </annotation>
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "unicode-bidi" type = "fo:unicode_bidi_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "character">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "color" type = "fo:color_Type"/> 
+          <attribute name = "glyph-orientation-horizontal" type = "fo:orientation_Type"/> 
+          <attribute name = "glyph-orientation-vertical" type = "fo:orientation_Type"/> 
+          <attribute name = "letter-spacing" type = "fo:letter_spacing_Type"/> 
+          <attribute name = "line-height" type = "fo:line_height_Type"/> 
+          <attribute name = "score-spaces" type = "fo:score_spaces_Type"/> 
+          <attribute name = "text-transform" type = "fo:text_transform_Type"/> 
+          <attribute name = "visibility" type = "fo:visibility_Type"/> 
+          <attribute name = "word-spacing" type = "fo:letter_spacing_Type"/>
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Hyphenation_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "treat-as-word-space" type = "fo:treat_as_word_space_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attribute name = "character" type = "fo:character_Type"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attributeGroup ref = "fo:text_one_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "keep-with-next" type = "fo:keep_integer_Type"/>
+      <attribute name = "keep-with-previous" type = "fo:keep_integer_Type"/>
+      <attribute name = "suppress-at-line-break" type = "fo:suppress_at_line_break_Type"/>
+      <attribute name = "text-decoration" type = "fo:text_decoration_Type"/>
+      <attribute name = "text-shadow" type = "fo:text_shadow_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "initial-property-set">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "color" type = "fo:color_Type"/> 
+          <attribute name = "letter-spacing" type = "fo:letter_spacing_Type"/> 
+          <attribute name = "line-height" type = "fo:line_height_Type"/> 
+          <attribute name = "score-spaces" type = "fo:score_spaces_Type"/> 
+          <attribute name = "text-transform" type = "fo:text_transform_Type"/> 
+          <attribute name = "word-spacing" type = "fo:letter_spacing_Type"/>
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "text-decoration" type = "fo:text_decoration_Type"/>
+      <attribute name = "text-shadow" type = "fo:text_shadow_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "external-graphic">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "display-align" type = "fo:display_align_Type"/> 
+          <attribute name = "line-height" type = "fo:line_height_Type"/> 
+          <attribute name = "text-align" type = "fo:text_align_Type"/>
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "content-height" type = "fo:content_height_Type"/>
+      <attribute name = "content-type" type = "xs:string"/>
+      <attribute name = "content-width" type = "fo:content_height_Type"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "keep-with-next" type = "fo:keep_integer_Type"/>
+      <attribute name = "keep-with-previous" type = "fo:keep_integer_Type"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attribute name = "scaling" type = "fo:scaling_Type"/>
+      <attribute name = "scaling-method" type = "fo:scaling_method_Type"/>
+      <attribute name = "src" type = "xs:string" use = "required"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "instream-foreign-object">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "display-align" type = "fo:display_align_Type"/> 
+          <attribute name = "line-height" type = "fo:line_height_Type"/> 
+          <attribute name = "text-align" type = "fo:text_align_Type"/>
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "content-height" type = "fo:content_height_Type"/>
+      <attribute name = "content-type" type = "xs:string"/>
+      <attribute name = "content-width" type = "fo:content_height_Type"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "keep-with-next" type = "fo:keep_integer_Type"/>
+      <attribute name = "keep-with-previous" type = "fo:keep_integer_Type"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attribute name = "scaling" type = "fo:scaling_Type"/>
+      <attribute name = "scaling-method" type = "fo:scaling_method_Type"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "inline">
+    <complexType mixed = "true">
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "color" type = "fo:color_Type"/> 
+          <attribute name = "line-height" type = "fo:line_height_Type"/> 
+          <attribute name = "visibility" type = "fo:visibility_Type"/> 
+          <attribute name = "wrap-option" type = "fo:wrap_option_Type"/>
+        </documentation>
+      </annotation>
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List">
+        <annotation>
+          <documentation>
+            <fop_result>Border and background properties not implemented</fop_result>
+          </documentation>
+        </annotation>
+      </attributeGroup>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attribute name = "text-decoration" type = "fo:text_decoration_Type"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "inline-container">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "display-align" type = "fo:display_align_Type"/>
+          <attribute name = "line-height" type = "fo:line_height_Type"/>
+        </documentation>
+      </annotation>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attributeGroup ref = "fo:clip_Properties_List"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attribute name = "overflow" type = "fo:overflow_Type"/>
+      <attributeGroup ref = "fo:reference_Properties_List"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "leader">
+    <complexType mixed = "true">
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "color" type = "fo:color_Type"/> 
+          <attribute name = "leader-alignment" type = "fo:leader_alignment_Type"/> 
+          <attribute name = "leader-length" type = "fo:leader_length_Type"/> 
+          <attribute name = "leader-length.minimum" type = "fo:length_Type"/>
+          <attribute name = "leader-length.optimum" type = "fo:length_Type"/>
+          <attribute name = "leader-length.maximum" type = "fo:length_Type"/>
+          <attribute name = "leader-pattern" type = "fo:leader_pattern_Type"/> 
+          <attribute name = "leader-pattern-width" type = "fo:leader_pattern_width_Type"/> 
+          <attribute name = "rule-style" type = "fo:rule_style_Type"/> 
+          <attribute name = "rule-thickness" type = "fo:length_Type"/> 
+          <attribute name = "letter-spacing" type = "fo:letter_spacing_Type"/> 
+          <attribute name = "line-height" type = "fo:line_height_Type"/> 
+          <attribute name = "visibility" type = "fo:visibility_Type"/> 
+          <attribute name = "word-spacing" type = "fo:letter_spacing_Type"/>
+        </documentation>
+      </annotation>
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:neutral_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attributeGroup ref = "fo:text_one_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "keep-with-next" type = "fo:keep_integer_Type"/>
+      <attribute name = "keep-with-previous" type = "fo:keep_integer_Type"/>
+      <attribute name = "text-shadow" type = "fo:text_shadow_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "page-number">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "letter-spacing" type = "fo:letter_spacing_Type"/>
+          <attribute name = "line-height" type = "fo:line_height_Type"/>
+          <attribute name = "score-spaces" type = "fo:score_spaces_Type"/>
+          <attribute name = "text-transform" type = "fo:text_transform_Type"/>
+          <attribute name = "visibility" type = "fo:visibility_Type"/>
+          <attribute name = "word-spacing" type = "fo:letter_spacing_Type"/>
+          <attribute name = "wrap-option" type = "fo:wrap_option_Type"/>
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "keep-with-next" type = "fo:keep_integer_Type"/>
+      <attribute name = "keep-with-previous" type = "fo:keep_integer_Type"/>
+      <attributeGroup ref = "fo:text_one_Properties_List"/>
+      <attribute name = "text-decoration" type = "fo:text_decoration_Type"/>
+      <attribute name = "text-shadow" type = "fo:text_shadow_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "page-number-citation">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "letter-spacing" type = "fo:letter_spacing_Type"/>
+          <attribute name = "line-height" type = "fo:line_height_Type"/>
+          <attribute name = "score-spaces" type = "fo:score_spaces_Type"/>
+          <attribute name = "text-transform" type = "fo:text_transform_Type"/>
+          <attribute name = "visibility" type = "fo:visibility_Type"/>
+          <attribute name = "word-spacing" type = "fo:letter_spacing_Type"/>
+          <attribute name = "wrap-option" type = "fo:wrap_option_Type"/>
+        </documentation>
+      </annotation>
+      <attribute name = "ref-id" type = "xs:string" use = "required"/>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Font_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "keep-with-next" type = "fo:keep_integer_Type"/>
+      <attribute name = "keep-with-previous" type = "fo:keep_integer_Type"/>
+      <attributeGroup ref = "fo:text_one_Properties_List"/>
+      <attribute name = "text-decoration" type = "fo:text_decoration_Type"/>
+      <attribute name = "text-shadow" type = "fo:text_shadow_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "table-and-caption">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "caption-side" type = "fo:caption_side_Type"/>
+          <attribute name = "text-align" type = "fo:text_align_Type"/>
+        </documentation>
+      </annotation>
+      <sequence>
+        <element ref = "fo:table-caption" minOccurs = "0"/>
+        <element ref = "fo:table"/>
+      </sequence>
+      <attributeGroup ref = "fo:block_properties"/>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attributeGroup ref = "fo:break_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:intrusion_displace_Properties_List"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "table-caption">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "keep-together" type = "fo:keep_compound_Type"/>
+          <attribute name = "keep-together.within-line" type = "fo:keep_integer_Type"/>
+          <attribute name = "keep-together.within-column" type = "fo:keep_integer_Type"/>
+          <attribute name = "keep-together.within-page" type = "fo:keep_integer_Type"/>
+        </documentation>
+      </annotation>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:intrusion_displace_Properties_List"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "table">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "border-collapse" type = "fo:border_collapse_Type"/>
+          <attribute name = "border-separation" type = "fo:length_bp_ip_direction_Type"/>
+          <attribute name = "border-spacing" type = "fo:length_Type"/>
+          <attribute name = "writing-mode" type = "fo:writing_mode_Type"/>
+        </documentation>
+      </annotation>
+      <sequence>
+        <element ref = "fo:table-column" minOccurs = "0" maxOccurs = "unbounded"/>
+        <element ref = "fo:table-header" minOccurs = "0"/>
+        <element ref = "fo:table-footer" minOccurs = "0"/>
+        <element ref = "fo:table-body" maxOccurs = "unbounded"/>
+      </sequence>
+      <attributeGroup ref = "fo:block_properties"/>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attribute name = "border-after-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-before-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-end-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-start-precedence" type = "fo:precedence_Type"/>
+      <attributeGroup ref = "fo:break_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:intrusion_displace_Properties_List"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attribute name = "table-layout" type = "fo:table_layout_Type"/>
+      <attribute name = "table-omit-footer-at-break" type = "fo:table_omit_footer_at_break_Type"/>
+      <attribute name = "table-omit-header-at-break" type = "fo:table_omit_header_at_break_Type"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "table-column">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "visibility" type = "fo:visibility_Type"/> 
+        </documentation>
+      </annotation>
+      <attributeGroup ref = "fo:Border_Properties_List"/>
+      <attributeGroup ref = "fo:Background_Properties_List"/>
+      <attribute name = "border-after-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-before-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-end-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-start-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "column-number" type = "fo:integer_Type"/>
+      <attribute name = "column-width" type = "fo:column_width_Type"/>
+      <attribute name = "number-columns-repeated" type = "fo:integer_Type"/>
+      <attribute name = "number-columns-spanned" type = "fo:integer_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "table-header">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "visibility" type = "fo:visibility_Type"/> 
+        </documentation>
+      </annotation>
+      <choice>
+        <element ref = "fo:table-row" maxOccurs = "unbounded"/>
+        <element ref = "fo:table-cell" maxOccurs = "unbounded"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Properties_List"/>
+      <attributeGroup ref = "fo:Background_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "border-after-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-before-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-end-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-start-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "table-footer">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "visibility" type = "fo:visibility_Type"/> 
+        </documentation>
+      </annotation>
+      <choice>
+        <element ref = "fo:table-row" maxOccurs = "unbounded"/>
+        <element ref = "fo:table-cell" maxOccurs = "unbounded"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Properties_List"/>
+      <attributeGroup ref = "fo:Background_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "border-after-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-before-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-end-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-start-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "table-body">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "visibility" type = "fo:visibility_Type"/> 
+        </documentation>
+      </annotation>
+      <choice>
+        <element ref = "fo:table-row" maxOccurs = "unbounded"/>
+        <element ref = "fo:table-cell" maxOccurs = "unbounded"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Properties_List"/>
+      <attributeGroup ref = "fo:Background_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "border-after-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-before-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-end-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-start-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "table-row">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "visibility" type = "fo:visibility_Type"/> 
+        </documentation>
+      </annotation>
+      <sequence>
+        <element ref = "fo:table-cell" maxOccurs = "unbounded"/>
+      </sequence>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Properties_List"/>
+      <attributeGroup ref = "fo:Background_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "block-progression-dimension" type = "fo:margin_width_Type"/>
+      <attribute name = "block-progression-dimension.minimum" type = "fo:length_Type"/>
+      <attribute name = "block-progression-dimension.optimum" type = "fo:block_progression_dimension_optimum_Type"/>
+      <attribute name = "block-progression-dimension.maximum" type = "fo:block_progression_dimension_maximum_Type"/>
+      <attribute name = "border-after-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-before-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-end-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-start-precedence" type = "fo:precedence_Type"/>
+      <attributeGroup ref = "fo:break_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "page-break-after"  type = "fo:page_break_after_Type"/>
+      <attribute name = "page-break-before" type = "fo:page_break_after_Type"/>
+    </complexType>
+  </element>
+  <element name = "table-cell">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "display-align" type = "fo:display_align_Type"/>
+          <attribute name = "relative-align" type = "fo:relative_align_Type"/>
+          <attribute name = "empty-cells" type = "fo:empty_cells_Type"/>
+        </documentation>
+      </annotation>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "border-after-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-before-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-end-precedence" type = "fo:precedence_Type"/>
+      <attribute name = "border-start-precedence" type = "fo:precedence_Type"/>
+      <attributeGroup ref = "fo:progression_Properties_List"/>
+      <attribute name = "column-number" type = "fo:integer_Type"/>
+      <attribute name = "ends-row" type = "fo:ends_row_Type"/>
+      <attribute name = "height" type = "fo:height_Type"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "number-columns-spanned" type = "fo:integer_Type"/>
+      <attribute name = "number-rows-spanned" type = "fo:integer_Type"/>
+      <attribute name = "starts-row" type = "fo:starts_row_Type"/>
+      <attribute name = "width" type = "fo:height_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "list-block">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable
+          <attribute name = "provisional-distance-between-starts" type = "fo:provisional_distance_between_starts_Type"/>
+          <attribute name = "provisional-label-separation" type = "fo:provisional_label_separation_Type"/>
+        </documentation>
+      </annotation>
+      <sequence>
+        <element ref = "fo:list-item" maxOccurs = "unbounded"/>
+      </sequence>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attributeGroup ref = "fo:break_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:intrusion_displace_Properties_List"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attributeGroup ref = "fo:list_properties"/>
+    </complexType>
+  </element>
+  <element name = "list-item">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "relative-align" type = "fo:relative_align_Type"/> 
+        </documentation>
+      </annotation>
+      <sequence>
+        <element ref = "fo:list-item-label"/>
+        <element ref = "fo:list-item-body"/>
+      </sequence>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Block_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attributeGroup ref = "fo:break_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:intrusion_displace_Properties_List"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attributeGroup ref = "fo:list_properties"/>
+    </complexType>
+  </element>
+  <element name = "list-item-body">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "keep-together" type = "fo:keep_compound_Type"/>
+          <attribute name = "keep-together.within-line" type = "fo:keep_integer_Type"/>
+          <attribute name = "keep-together.within-column" type = "fo:keep_integer_Type"/>
+          <attribute name = "keep-together.within-page" type = "fo:keep_integer_Type"/>
+        </documentation>
+      </annotation>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attributeGroup ref = "fo:list_properties"/>
+    </complexType>
+  </element>
+  <element name = "list-item-label">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable 
+          <attribute name = "keep-together" type = "fo:keep_compound_Type"/>
+          <attribute name = "keep-together.within-line" type = "fo:keep_integer_Type"/>
+          <attribute name = "keep-together.within-column" type = "fo:keep_integer_Type"/>
+          <attribute name = "keep-together.within-page" type = "fo:keep_integer_Type"/>
+        </documentation>
+      </annotation>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attributeGroup ref = "fo:list_properties"/>
+    </complexType>
+  </element>
+  <element name = "float">
+    <complexType>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attribute name = "float" type = "fo:float_Type"/>
+      <attribute name = "clear" type = "fo:clear_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "footnote">
+    <complexType>
+      <sequence>
+        <element ref = "fo:inline"/>
+        <element ref = "fo:footnote-body"/>
+      </sequence>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "footnote-body">
+    <complexType>
+      <choice maxOccurs = "unbounded">
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "basic-link">
+    <complexType mixed = "true">
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "line-height" type = "fo:line_height_Type"/> 
+        </documentation>
+      </annotation>
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attributeGroup ref = "fo:Aural_Properties_List"/>
+      <attributeGroup ref = "fo:Border_Padding_and_Background_Properties_List"/>
+      <attributeGroup ref = "fo:Margin_Properties_Inline_List"/>
+      <attributeGroup ref = "fo:Relative_Position_Properties_List"/>
+      <attribute name = "alignment-adjust" type = "fo:alignment_adjust_Type"/>
+      <attribute name = "alignment-baseline" type = "fo:alignment_baseline_Type"/>
+      <attribute name = "baseline-shift" type = "fo:baseline_shift_Type"/>
+      <attribute name = "destination-placement-offset" type = "fo:length_Type"/>
+      <attribute name = "dominant-baseline" type = "fo:dominant_baseline_Type"/>
+      <attribute name = "external-destination" type = "xs:string"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "indicate-destination" type = "fo:indicate_destination_Type"/>
+      <attribute name = "internal-destination" type = "xs:string"/>
+      <attributeGroup ref = "fo:keep_Properties_List"/>
+      <attribute name = "show-destination" type = "fo:show_destination_Type"/>
+      <attribute name = "target-processing-context" type = "xs:string"/>
+      <attribute name = "target-presentation-context" type = "xs:string"/>
+      <attribute name = "target-stylesheet" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "wrapper">
+    <complexType mixed = "true">
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:marker_List"/>
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "marker">
+    <complexType mixed = "true">
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+      </choice>
+      <attribute name = "marker-class-name" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "retrieve-marker">
+    <complexType>
+      <attribute name = "retrieve-class-name" type = "xs:string"/>
+      <attribute name = "retrieve-position" type = "fo:retrieve_position_Type"/>
+      <attribute name = "retrieve-boundary" type = "fo:retrieve_boundary_Type"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "multi-switch">
+    <complexType>
+      <annotation>
+        <documentation>
+          Inheritable <attribute name = "auto-restore" type = "fo:auto_restore_Type"/> 
+        </documentation>
+      </annotation>
+      <sequence>
+        <element ref = "fo:multi-case"/>
+      </sequence>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "multi-case">
+    <complexType mixed = "true">
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "starting-state" type = "fo:starting_state_Type"/>
+      <attribute name = "case-name" type = "xs:string"/>
+      <attribute name = "case-title" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "multi-toggle">
+    <complexType mixed = "true">
+      <choice minOccurs = "0" maxOccurs = "unbounded">
+        <group ref = "fo:inline_List"/>
+        <group ref = "fo:block_List"/>
+        <group ref = "fo:neutral_List"/>
+        <group ref = "fo:float_List"/>
+        <group ref = "fo:footnote_List"/>
+      </choice>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "switch-to" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+      <attribute name = "vertical-align" type = "fo:vertical_align_Type"/>
+    </complexType>
+  </element>
+  <element name = "multi-properties">
+    <complexType>
+      <sequence>
+        <element ref = "fo:multi-property-set" maxOccurs = "unbounded"/>
+        <element ref = "fo:wrapper"/>
+      </sequence>
+      <attributeGroup ref = "fo:Accessibility_Properties_List"/>
+      <attribute name = "id" type = "xs:string"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+  <element name = "multi-property-set">
+    <complexType>
+      <attribute name = "id" type = "xs:string"/>
+      <attribute name = "active-state" type = "fo:active_state_Type" use = "required"/>
+      <attributeGroup ref = "fo:inheritable_properties_List"/>
+    </complexType>
+  </element>
+</schema>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0-RFC6321.rnc b/org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0-RFC6321.rnc
new file mode 100644 (file)
index 0000000..d18211d
--- /dev/null
@@ -0,0 +1,1192 @@
+   default namespace = "urn:ietf:params:xml:ns:icalendar-2.0"
+
+   # 3.2 Property Parameters
+
+   # 3.2.1 Alternate Text Representation
+
+   altrepparam = element altrep {
+       value-uri
+   }
+
+   # 3.2.2 Common Name
+
+   cnparam = element cn {
+       value-text
+   }
+
+   # 3.2.3 Calendar User Type
+
+   cutypeparam = element cutype {
+       element text {
+           "INDIVIDUAL" |
+           "GROUP" |
+           "RESOURCE" |
+           "ROOM" |
+           "UNKNOWN"
+       }
+   }
+
+   # 3.2.4 Delegators
+
+   delfromparam = element delegated-from {
+       value-cal-address+
+   }
+
+   # 3.2.5 Delegatees
+
+   deltoparam = element delegated-to {
+       value-cal-address+
+   }
+
+   # 3.2.6 Directory Entry Reference
+
+   dirparam = element dir {
+       value-uri
+   }
+
+   # 3.2.7 Inline Encoding
+
+   encodingparam = element encoding {
+       element text {
+           "8BIT" |
+           "BASE64"
+       }
+   }
+
+   # 3.2.8 Format Type
+
+   fmttypeparam = element fmttype {
+       value-text
+   }
+
+   # 3.2.9 Free/Busy Time Type
+
+   fbtypeparam = element fbtype {
+       element text {
+           "FREE" |
+           "BUSY" |
+           "BUSY-UNAVAILABLE" |
+           "BUSY-TENTATIVE"
+       }
+   }
+
+   # 3.2.10 Language
+
+   languageparam = element language {
+       value-text
+   }
+
+   # 3.2.11 Group or List Membership
+
+   memberparam = element member {
+       value-cal-address+
+   }
+
+   # 3.2.12 Participation Status
+
+   partstatparam = element partstat {
+       type-partstat-event |
+       type-partstat-todo |
+       type-partstat-jour
+   }
+
+   type-partstat-event = (
+       element text {
+           "NEEDS-ACTION" |
+           "ACCEPTED" |
+           "DECLINED" |
+           "TENTATIVE" |
+           "DELEGATED"
+       }
+   )
+
+   type-partstat-todo = (
+       element text {
+           "NEEDS-ACTION" |
+           "ACCEPTED" |
+           "DECLINED" |
+           "TENTATIVE" |
+           "DELEGATED" |
+           "COMPLETED" |
+           "IN-PROCESS"
+       }
+   )
+
+   type-partstat-jour = (
+       element text {
+           "NEEDS-ACTION" |
+           "ACCEPTED" |
+           "DECLINED"
+       }
+   )
+
+   # 3.2.13 Recurrence Identifier Range
+
+   rangeparam = element range {
+       element text {
+           "THISANDFUTURE"
+       }
+   }
+
+   # 3.2.14 Alarm Trigger Relationship
+
+   trigrelparam = element related {
+       element text {
+           "START" |
+           "END"
+       }
+   }
+
+   # 3.2.15 Relationship Type
+
+   reltypeparam = element reltype {
+       element text {
+           "PARENT" |
+           "CHILD" |
+           "SIBLING"
+       }
+   }
+
+   # 3.2.16 Participation Role
+
+   roleparam = element role {
+       element text {
+           "CHAIR" |
+           "REQ-PARTICIPANT" |
+           "OPT-PARTICIPANT" |
+           "NON-PARTICIPANT"
+       }
+   }
+
+   # 3.2.17 RSVP Expectation
+
+   rsvpparam = element rsvp {
+       value-boolean
+   }
+
+   # 3.2.18 Sent By
+
+   sentbyparam = element sent-by {
+       value-cal-address
+   }
+
+   # 3.2.19 Time Zone Identifier
+
+   tzidparam = element tzid {
+       value-text
+   }
+
+   # 3.3 Property Value Data Types
+
+   # 3.3.1 BINARY
+
+   value-binary =  element binary {
+       xsd:string
+   }
+
+   # 3.3.2 BOOLEAN
+
+   value-boolean = element boolean {
+       xsd:boolean
+   }
+
+   # 3.3.3 CAL-ADDRESS
+
+   value-cal-address = element cal-address {
+       xsd:anyURI
+   }
+
+   # 3.3.4 DATE
+
+   pattern-date = xsd:string {
+       pattern = "\d\d\d\d-\d\d-\d\d"
+   }
+
+   value-date = element date {
+       pattern-date
+   }
+
+   # 3.3.5 DATE-TIME
+
+   pattern-date-time = xsd:string {
+       pattern = "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?"
+   }
+
+   value-date-time = element date-time {
+       pattern-date-time
+   }
+
+   # 3.3.6 DURATION
+
+   pattern-duration = xsd:string {
+       pattern = "(+|-)?P(\d+W)|(\d+D)?"
+               ~ "(T(\d+H(\d+M)?(\d+S)?)|"
+               ~   "(\d+M(\d+S)?)|"
+               ~   "(\d+S))?"
+   }
+
+   value-duration = element duration {
+       pattern-duration
+   }
+
+   # 3.3.7 FLOAT
+
+   value-float = element float {
+       xsd:float
+   }
+
+   # 3.3.8 INTEGER
+
+   value-integer = element integer {
+       xsd:integer
+   }
+
+   # 3.3.9 PERIOD
+
+   value-period = element period {
+       element start {
+           pattern-date-time
+       },
+       (
+           element end {
+               pattern-date-time
+           } |
+           element duration {
+               pattern-duration
+           }
+       )
+   }
+
+   # 3.3.10 RECUR
+
+   value-recur = element recur {
+       type-freq,
+       (type-until | type-count)?,
+       element interval {
+           xsd:positiveInteger
+       }?,
+       type-bysecond*,
+       type-byminute*,
+       type-byhour*,
+       type-byday*,
+       type-bymonthday*,
+       type-byyearday*,
+       type-byweekno*,
+       type-bymonth*,
+       type-bysetpos*,
+       element wkst { type-weekday }?
+   }
+
+   type-freq = element freq {
+       "SECONDLY" |
+       "MINUTELY" |
+       "HOURLY"   |
+       "DAILY"    |
+       "WEEKLY"   |
+       "MONTHLY"  |
+       "YEARLY"
+   }
+
+   type-until = element until {
+       type-date |
+       type-date-time
+   }
+
+   type-count = element count {
+       xsd:positiveInteger
+   }
+
+   type-bysecond = element bysecond {
+       xsd:positiveInteger
+   }
+
+   type-byminute = element byminute {
+       xsd:positiveInteger
+   }
+
+   type-byhour = element byhour {
+       xsd:positiveInteger
+   }
+
+   type-weekday = (
+       "SU" |
+       "MO" |
+       "TU" |
+       "WE" |
+       "TH" |
+       "FR" |
+       "SA"
+   )
+
+   type-byday = element byday {
+       xsd:integer?,
+       type-weekday
+   }
+
+   type-bymonthday = element bymonthday {
+       xsd:integer
+   }
+
+   type-byyearday = element byyearday {
+       xsd:integer
+   }
+
+   type-byweekno = element byweekno {
+       xsd:integer
+   }
+
+   type-bymonth = element bymonth {
+       xsd:positiveInteger
+   }
+
+   type-bysetpos = element bysetpos {
+       xsd:integer
+   }
+
+   # 3.3.11 TEXT
+
+   value-text = element text {
+       xsd:string
+   }
+
+   # 3.3.12 TIME
+
+   pattern-time = xsd:string {
+       pattern = "\d\d:\d\d:\d\dZ?"
+   }
+
+   value-time = element time {
+       pattern-time
+   }
+
+   # 3.3.13 URI
+
+   value-uri = element uri {
+       xsd:anyURI
+   }
+
+   # 3.3.14 UTC-OFFSET
+
+   value-utc-offset = element utc-offset {
+       xsd:string { pattern = "(+|-)\d\d:\d\d(:\d\d)?" }
+   }
+
+   # UNKNOWN
+
+   value-unknown = element unknown {
+       xsd:string
+   }
+
+   # 3.4 iCalendar Stream
+
+   start = element icalendar {
+       vcalendar+
+   }
+
+   # 3.6 Calendar Components
+
+   vcalendar = element vcalendar {
+       type-calprops,
+       type-component
+   }
+
+   type-calprops = element properties {
+       property-prodid &
+       property-version &
+       property-calscale? &
+       property-method?
+   }
+
+   type-component = element components {
+       (
+           component-vevent |
+           component-vtodo |
+           component-vjournal |
+           component-vfreebusy |
+           component-vtimezone
+       )*
+   }
+
+   # 3.6.1 Event Component
+
+   component-vevent = element vevent {
+       type-eventprop,
+       element components {
+           component-valarm+
+       }?
+   }
+
+   type-eventprop = element properties {
+       property-dtstamp &
+       property-dtstart &
+       property-uid &
+
+       property-class? &
+       property-created? &
+       property-description? &
+       property-geo? &
+       property-last-mod? &
+       property-location? &
+       property-organizer? &
+       property-priority? &
+       property-seq? &
+       property-status-event? &
+
+       property-summary? &
+       property-transp? &
+       property-url? &
+       property-recurid? &
+
+       property-rrule? &
+
+       (property-dtend | property-duration)? &
+
+       property-attach* &
+       property-attendee* &
+       property-categories* &
+       property-comment* &
+       property-contact* &
+       property-exdate* &
+       property-rstatus* &
+       property-related* &
+       property-resources* &
+       property-rdate*
+   }
+
+   # 3.6.2 To-do Component
+
+   component-vtodo = element vtodo {
+       type-todoprop,
+       element components {
+           component-valarm+
+       }?
+   }
+
+   type-todoprop = element properties {
+       property-dtstamp &
+       property-uid &
+
+       property-class? &
+       property-completed? &
+       property-created? &
+       property-description? &
+       property-geo? &
+       property-last-mod? &
+       property-location? &
+       property-organizer? &
+       property-percent? &
+       property-priority? &
+       property-recurid? &
+       property-seq? &
+       property-status-todo? &
+       property-summary? &
+
+       property-url? &
+
+       property-rrule? &
+
+       (
+           (property-dtstart?, property-dtend? ) |
+           (property-dtstart, property-duration)?
+       ) &
+
+       property-attach* &
+       property-attendee* &
+       property-categories* &
+       property-comment* &
+       property-contact* &
+       property-exdate* &
+       property-rstatus* &
+       property-related* &
+       property-resources* &
+       property-rdate*
+   }
+
+   # 3.6.3 Journal Component
+
+   component-vjournal = element vjournal {
+       type-jourprop
+   }
+
+   type-jourprop = element properties {
+       property-dtstamp &
+       property-uid &
+
+       property-class? &
+       property-created? &
+       property-dtstart? &
+       property-last-mod? &
+       property-organizer? &
+       property-recurid? &
+       property-seq? &
+       property-status-jour? &
+       property-summary? &
+       property-url? &
+
+       property-rrule? &
+
+       property-attach* &
+       property-attendee* &
+       property-categories* &
+       property-comment* &
+       property-contact* &
+       property-description? &
+       property-exdate* &
+       property-related* &
+       property-rdate* &
+       property-rstatus*
+   }
+
+   # 3.6.4 Free/Busy Component
+
+   component-vfreebusy = element vfreebusy {
+       type-fbprop
+   }
+
+   type-fbprop = element properties {
+       property-dtstamp &
+       property-uid &
+
+       property-contact? &
+       property-dtstart? &
+       property-dtend? &
+       property-duration? &
+       property-organizer? &
+       property-url? &
+
+       property-attendee* &
+       property-comment* &
+       property-freebusy* &
+       property-rstatus*
+   }
+
+   # 3.6.5 Time Zone Component
+
+   component-vtimezone = element vtimezone {
+       element properties {
+           property-tzid &
+
+           property-last-mod? &
+           property-tzuurl?
+       },
+       element components {
+           (component-standard | component-daylight) &
+           component-standard* &
+           component-daylight*
+       }
+   }
+
+   component-standard = element standard {
+       type-tzprop
+   }
+
+   component-daylight = element daylight {
+       type-tzprop
+   }
+
+   type-tzprop = element properties {
+       property-dtstart &
+       property-tzoffsetto &
+       property-tzoffsetfrom &
+
+       property-rrule? &
+
+       property-comment* &
+       property-rdate* &
+       property-tzname*
+   }
+
+   # 3.6.6 Alarm Component
+
+   component-valarm = element valarm {
+       audioprop | dispprop | emailprop
+   }
+
+   type-audioprop = element properties {
+       property-action &
+
+       property-trigger &
+
+       (property-duration, property-repeat)? &
+
+       property-attach?
+   }
+
+   type-dispprop = element properties {
+       property-action &
+       property-description &
+       property-trigger &
+       property-summary &
+
+       property-attendee+ &
+
+       (property-duration, property-repeat)? &
+
+       property-attach*
+   }
+
+   type-emailprop = element properties {
+       property-action &
+       property-description &
+       property-trigger &
+
+       (property-duration, property-repeat)?
+   }
+
+   # 3.7 Calendar Properties
+
+   # 3.7.1 Calendar Scale
+
+   property-calscale = element calscale {
+
+       element parameters { empty }?,
+
+       element text { "GREGORIAN" }
+   }
+
+   # 3.7.2 Method
+
+   property-method = element method {
+
+       element parameters { empty }?,
+
+       value-text
+   }
+
+   # 3.7.3 Product Identifier
+
+   property-prodid = element prodid {
+
+       element parameters { empty }?,
+
+       value-text
+   }
+
+   # 3.7.4 Version
+
+   property-version = element version {
+
+       element parameters { empty }?,
+
+       element text { "2.0" }
+   }
+
+   # 3.8 Component Properties
+
+   # 3.8.1 Descriptive Component Properties
+
+   # 3.8.1.1 Attachment
+
+   property-attach = element attach {
+
+       element parameters {
+           fmttypeparam? &
+           encodingparam?
+       }?,
+
+       value-uri | value-binary
+   }
+
+   # 3.8.1.2 Categories
+
+   property-categories = element categories {
+
+       element parameters {
+           languageparam? &
+       }?,
+
+       value-text+
+   }
+
+   # 3.8.1.3 Classification
+
+   property-class = element class {
+
+       element parameters { empty }?,
+
+       element text {
+           "PUBLIC" |
+           "PRIVATE" |
+           "CONFIDENTIAL"
+       }
+   }
+
+   # 3.8.1.4 Comment
+
+   property-comment = element comment {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.1.5 Description
+
+   property-description = element description {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.1.6 Geographic Position
+
+   property-geo = element geo {
+
+       element parameters { empty }?,
+
+       element latitude  { xsd:float },
+       element longitude { xsd:float }
+   }
+
+   # 3.8.1.7 Location
+
+   property-location = element location {
+
+       element parameters {
+
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.1.8 Percent Complete
+
+   property-percent = element percent-complete {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+
+   # 3.8.1.9 Priority
+
+   property-priority = element priority {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+   # 3.8.1.10 Resources
+
+   property-resources = element resources {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text+
+   }
+
+   # 3.8.1.11 Status
+
+   property-status-event = element status {
+
+       element parameters { empty }?,
+
+       element text {
+           "TENTATIVE" |
+           "CONFIRMED" |
+           "CANCELLED"
+       }
+   }
+
+   property-status-todo = element status {
+
+       element parameters { empty }?,
+
+       element text {
+           "NEEDS-ACTION" |
+           "COMPLETED" |
+           "IN-PROCESS" |
+           "CANCELLED"
+       }
+   }
+
+   property-status-jour = element status {
+
+       element parameters { empty }?,
+
+       element text {
+           "DRAFT" |
+           "FINAL" |
+           "CANCELLED"
+       }
+   }
+
+   # 3.8.1.12 Summary
+
+   property-summary = element summary {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.2 Date and Time Component Properties
+
+   # 3.8.2.1 Date/Time Completed
+
+   property-completed = element completed {
+
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.2.2 Date/Time End
+
+   property-dtend = element dtend {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       value-date-time |
+       value-date
+   }
+
+   # 3.8.2.3 Date/Time Due
+
+   property-due = element due {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       value-date-time |
+       value-date
+   }
+
+   # 3.8.2.4 Date/Time Start
+
+   property-dtstart = element dtstart {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       value-date-time |
+       value-date
+   }
+
+   # 3.8.2.5 Duration
+
+   property-duration = element duration {
+
+       element parameters { empty }?,
+
+       value-duration
+   }
+
+   # 3.8.2.6 Free/Busy Time
+
+   property-freebusy = element freebusy {
+
+       element parameters {
+           fbtypeparam?
+       }?,
+
+
+       value-period+
+   }
+
+   # 3.8.2.7 Time Transparency
+
+   property-transp = element transp {
+
+
+       element parameters { empty }?,
+
+       element text {
+           "OPAQUE" |
+           "TRANSPARENT"
+       }
+   }
+
+   # 3.8.3 Time Zone Component Properties
+
+   # 3.8.3.1 Time Zone Identifier
+
+   property-tzid = element tzid {
+
+       element parameters { empty }?,
+
+       value-text
+   }
+
+   # 3.8.3.2 Time Zone Name
+
+   property-tzname = element tzname {
+
+       element parameters {
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.3.3 Time Zone Offset From
+
+   property-tzoffsetfrom = element tzoffsetfrom {
+
+       element parameters { empty }?,
+
+       value-utc-offset
+   }
+
+   # 3.8.3.4 Time Zone Offset To
+
+   property-tzoffsetto = element tzoffsetto {
+
+       element parameters { empty }?,
+
+       value-utc-offset
+   }
+
+   # 3.8.3.5 Time Zone URL
+
+   property-tzurl = element tzurl {
+
+       element parameters { empty }?,
+
+       value-uri
+   }
+
+   # 3.8.4 Relationship Component Properties
+
+   # 3.8.4.1 Attendee
+
+   property-attendee = element attendee {
+
+       element parameters {
+           cutypeparam? &
+           memberparam? &
+           roleparam? &
+           partstatparam? &
+           rsvpparam? &
+           deltoparam? &
+           delfromparam? &
+           sentbyparam? &
+           cnparam? &
+           dirparam? &
+           languageparam?
+       }?,
+
+       value-cal-address
+   }
+
+   # 3.8.4.2 Contact
+
+   property-contact = element contact {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.4.3 Organizer
+
+   property-organizer = element organizer {
+
+       element parameters {
+           cnparam? &
+           dirparam? &
+           sentbyparam? &
+           languageparam?
+       }?,
+
+       value-cal-address
+   }
+
+   # 3.8.4.4 Recurrence ID
+
+   property-recurid = element recurrence-id {
+
+       element parameters {
+           tzidparam? &
+           rangeparam?
+       }?,
+
+       value-date-time |
+       value-date
+   }
+
+   # 3.8.4.5 Related-To
+
+   property-related = element related-to {
+
+       element parameters {
+           reltypeparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.4.6 Uniform Resource Locator
+
+   property-url = element url {
+
+       element parameters { empty }?,
+
+       value-uri
+   }
+
+   # 3.8.4.7 Unique Identifier
+
+   property-uid = element uid {
+
+       element parameters { empty }?,
+       value-text
+   }
+
+   # 3.8.5 Recurrence Component Properties
+
+   # 3.8.5.1 Exception Date/Times
+
+   property-exdate = element exdate {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       value-date-time+ |
+       value-date+
+   }
+
+   # 3.8.5.2 Recurrence Date/Times
+
+   property-rdate = element rdate {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       value-date-time+ |
+       value-date+ |
+       value-period+
+   }
+
+   # 3.8.5.3 Recurrence Rule
+
+   property-rrule = element rrule {
+
+       element parameters { empty }?,
+
+       value-recur
+   }
+
+   # 3.8.6 Alarm Component Properties
+
+   # 3.8.6.1 Action
+
+   property-action = element action {
+
+       element parameters { empty }?,
+       element text {
+           "AUDIO" |
+           "DISPLAY" |
+           "EMAIL"
+       }
+   }
+
+   # 3.8.6.2 Repeat Count
+
+   property-repeat = element repeat {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+   # 3.8.6.3 Trigger
+
+   property-trigger = element trigger {
+
+       (
+           element parameters {
+               trigrelparam?
+           }?,
+
+           value-duration
+       ) |
+       (
+           element parameters { empty }?,
+
+           value-date-time
+       )
+   }
+
+   # 3.8.7 Change Management Component Properties
+
+   # 3.8.7.1 Date/Time Created
+
+   property-created = element created {
+
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.7.2 Date/Time Stamp
+
+   property-dtstamp = element dtstamp {
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.7.3 Last Modified
+
+   property-last-mod = element last-modified {
+
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.7.4 Sequence Number
+
+   property-seq = element sequence {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+   # 3.8.8 Miscellaneous Component Properties
+
+   # 3.8.8.3 Request Status
+
+   property-rstatus = element request-status {
+
+       element parameters {
+           languageparam?
+       }?,
+
+       element code { xsd:string },
+       element description { xsd:string },
+       element data { xsd:string }?
+   }
+
+
+
+
+
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0.rnc b/org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0.rnc
new file mode 100644 (file)
index 0000000..4c863be
--- /dev/null
@@ -0,0 +1,1207 @@
+   default namespace = "urn:ietf:params:xml:ns:icalendar-2.0"
+
+   # 3.2 Property Parameters
+
+   # 3.2.1 Alternate Text Representation
+
+   altrepparam = element altrep {
+       value-uri
+   }
+
+   # 3.2.2 Common Name
+
+   cnparam = element cn {
+       value-text
+   }
+
+   # 3.2.3 Calendar User Type
+
+   cutypeparam = element cutype {
+       element text {
+           "INDIVIDUAL" |
+           "GROUP" |
+           "RESOURCE" |
+           "ROOM" |
+           "UNKNOWN"
+       }
+   }
+
+   # 3.2.4 Delegators
+
+   delfromparam = element delegated-from {
+       value-cal-address+
+   }
+
+   # 3.2.5 Delegatees
+
+   deltoparam = element delegated-to {
+       value-cal-address+
+   }
+
+   # 3.2.6 Directory Entry Reference
+
+   dirparam = element dir {
+       value-uri
+   }
+
+   # 3.2.7 Inline Encoding
+
+   encodingparam = element encoding {
+       element text {
+           "8BIT" |
+           "BASE64"
+       }
+   }
+
+   # 3.2.8 Format Type
+
+   fmttypeparam = element fmttype {
+       value-text
+   }
+
+   # 3.2.9 Free/Busy Time Type
+
+   fbtypeparam = element fbtype {
+       element text {
+           "FREE" |
+           "BUSY" |
+           "BUSY-UNAVAILABLE" |
+           "BUSY-TENTATIVE"
+       }
+   }
+
+   # 3.2.10 Language
+
+   languageparam = element language {
+       value-text
+   }
+
+   # 3.2.11 Group or List Membership
+
+   memberparam = element member {
+       value-cal-address+
+   }
+
+   # 3.2.12 Participation Status
+
+   partstatparam = element partstat {
+       type-partstat-event |
+       type-partstat-todo |
+       type-partstat-jour
+   }
+
+   type-partstat-event = (
+       element text {
+           "NEEDS-ACTION" |
+           "ACCEPTED" |
+           "DECLINED" |
+           "TENTATIVE" |
+           "DELEGATED"
+       }
+   )
+
+   type-partstat-todo = (
+       element text {
+           "NEEDS-ACTION" |
+           "ACCEPTED" |
+           "DECLINED" |
+           "TENTATIVE" |
+           "DELEGATED" |
+           "COMPLETED" |
+           "IN-PROCESS"
+       }
+   )
+
+   type-partstat-jour = (
+       element text {
+           "NEEDS-ACTION" |
+           "ACCEPTED" |
+           "DECLINED"
+       }
+   )
+
+   # 3.2.13 Recurrence Identifier Range
+
+   rangeparam = element range {
+       element text {
+           "THISANDFUTURE"
+       }
+   }
+
+   # 3.2.14 Alarm Trigger Relationship
+
+   trigrelparam = element related {
+       element text {
+           "START" |
+           "END"
+       }
+   }
+
+   # 3.2.15 Relationship Type
+
+   reltypeparam = element reltype {
+       element text {
+           "PARENT" |
+           "CHILD" |
+           "SIBLING"
+       }
+   }
+
+   # 3.2.16 Participation Role
+
+   roleparam = element role {
+       element text {
+           "CHAIR" |
+           "REQ-PARTICIPANT" |
+           "OPT-PARTICIPANT" |
+           "NON-PARTICIPANT"
+       }
+   }
+
+   # 3.2.17 RSVP Expectation
+
+   rsvpparam = element rsvp {
+       value-boolean
+   }
+
+   # 3.2.18 Sent By
+
+   sentbyparam = element sent-by {
+       value-cal-address
+   }
+
+   # 3.2.19 Time Zone Identifier
+
+   tzidparam = element tzid {
+       value-text
+   }
+
+   # 3.3 Property Value Data Types
+
+   # 3.3.1 BINARY
+
+   value-binary =  element binary {
+       xsd:string
+   }
+
+   # 3.3.2 BOOLEAN
+
+   value-boolean = element boolean {
+       xsd:boolean
+   }
+
+   # 3.3.3 CAL-ADDRESS
+
+   value-cal-address = element cal-address {
+       xsd:anyURI
+   }
+
+   # 3.3.4 DATE
+
+   pattern-date = xsd:string {
+       pattern = "\d\d\d\d-\d\d-\d\d"
+   }
+
+   value-date = element date {
+       pattern-date
+   }
+
+   # 3.3.5 DATE-TIME
+
+   pattern-date-time = xsd:string {
+       pattern = "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?"
+   }
+
+   value-date-time = element date-time {
+       pattern-date-time
+   }
+
+   # 3.3.6 DURATION
+
+   pattern-duration = xsd:string {
+       # mbaudier - 2022-05-31 : corrected regexp from RFC 6321
+       pattern = "(\+|-)?P(\d+W)|(\d+D)?"
+               ~ "(T(\d+H(\d+M)?(\d+S)?)|"
+               ~   "(\d+M(\d+S)?)|"
+               ~   "(\d+S))?"
+   }
+
+   value-duration = element duration {
+       pattern-duration
+   }
+
+   # 3.3.7 FLOAT
+
+   value-float = element float {
+       xsd:float
+   }
+
+   # 3.3.8 INTEGER
+
+   value-integer = element integer {
+       xsd:integer
+   }
+
+   # 3.3.9 PERIOD
+
+   value-period = element period {
+       element start {
+           pattern-date-time
+       },
+       (
+           element end {
+               pattern-date-time
+           } |
+           element duration {
+               pattern-duration
+           }
+       )
+   }
+
+   # 3.3.10 RECUR
+
+   value-recur = element recur {
+       type-freq,
+       (type-until | type-count)?,
+       element interval {
+           xsd:positiveInteger
+       }?,
+       type-bysecond*,
+       type-byminute*,
+       type-byhour*,
+       type-byday*,
+       type-bymonthday*,
+       type-byyearday*,
+       type-byweekno*,
+       type-bymonth*,
+       type-bysetpos*,
+       element wkst { type-weekday }?
+   }
+
+   type-freq = element freq {
+       "SECONDLY" |
+       "MINUTELY" |
+       "HOURLY"   |
+       "DAILY"    |
+       "WEEKLY"   |
+       "MONTHLY"  |
+       "YEARLY"
+   }
+
+   type-until = element until {
+       # mbaudier - 2022-05-31 : corrected undefined pattern from RFC 6321
+       value-date |
+       value-date-time
+   }
+
+   type-count = element count {
+       xsd:positiveInteger
+   }
+
+   type-bysecond = element bysecond {
+       xsd:positiveInteger
+   }
+
+   type-byminute = element byminute {
+       xsd:positiveInteger
+   }
+
+   type-byhour = element byhour {
+       xsd:positiveInteger
+   }
+
+   type-weekday = (
+       "SU" |
+       "MO" |
+       "TU" |
+       "WE" |
+       "TH" |
+       "FR" |
+       "SA"
+   )
+
+   type-byday = element byday {
+       # mbaudier - 2022-05-31 : corrected (?) grouping data is only allowed inside list from RFC 6321
+       xsd:integer? |
+       type-weekday
+   }
+
+   type-bymonthday = element bymonthday {
+       xsd:integer
+   }
+
+   type-byyearday = element byyearday {
+       xsd:integer
+   }
+
+   type-byweekno = element byweekno {
+       xsd:integer
+   }
+
+   type-bymonth = element bymonth {
+       xsd:positiveInteger
+   }
+
+   type-bysetpos = element bysetpos {
+       xsd:integer
+   }
+
+   # 3.3.11 TEXT
+
+   value-text = element text {
+       xsd:string
+   }
+
+   # 3.3.12 TIME
+
+   pattern-time = xsd:string {
+       pattern = "\d\d:\d\d:\d\dZ?"
+   }
+
+   value-time = element time {
+       pattern-time
+   }
+
+   # 3.3.13 URI
+
+   value-uri = element uri {
+       xsd:anyURI
+   }
+
+   # 3.3.14 UTC-OFFSET
+
+   value-utc-offset = element utc-offset {
+       # mbaudier - 2022-05-31 : corrected regexp from RFC 6321
+       xsd:string { pattern = "(\+|-)\d\d:\d\d(:\d\d)?" }
+   }
+
+   # UNKNOWN
+
+   value-unknown = element unknown {
+       xsd:string
+   }
+
+   # 3.4 iCalendar Stream
+
+   start = element icalendar {
+       vcalendar+
+   }
+
+   # 3.6 Calendar Components
+
+   vcalendar = element vcalendar {
+       type-calprops,
+       type-component
+   }
+
+   type-calprops = element properties {
+       property-prodid &
+       property-version &
+       property-calscale? &
+       property-method?
+   }
+
+   type-component = element components {
+       (
+           component-vevent |
+           component-vtodo |
+           component-vjournal |
+           component-vfreebusy |
+           component-vtimezone
+       )*
+   }
+
+   # 3.6.1 Event Component
+
+   component-vevent = element vevent {
+       type-eventprop,
+       element components {
+           component-valarm+
+       }?
+   }
+
+   type-eventprop = element properties {
+       property-dtstamp &
+       property-dtstart &
+       property-uid &
+
+       property-class? &
+       property-created? &
+       property-description? &
+       property-geo? &
+       property-last-mod? &
+       property-location? &
+       property-organizer? &
+       property-priority? &
+       property-seq? &
+       property-status-event? &
+
+       property-summary? &
+       property-transp? &
+       property-url? &
+       property-recurid? &
+
+       property-rrule? &
+
+       (property-dtend | property-duration)? &
+
+       property-attach* &
+       property-attendee* &
+       property-categories* &
+       property-comment* &
+       property-contact* &
+       property-exdate* &
+       property-rstatus* &
+       property-related* &
+       property-resources* &
+       property-rdate*
+   }
+
+   # 3.6.2 To-do Component
+
+   component-vtodo = element vtodo {
+       type-todoprop,
+       element components {
+           component-valarm+
+       }?
+   }
+
+   type-todoprop = element properties {
+       property-dtstamp &
+       property-uid &
+
+       property-class? &
+       property-completed? &
+       property-created? &
+       property-description? &
+       property-geo? &
+       property-last-mod? &
+       property-location? &
+       property-organizer? &
+       property-percent? &
+       property-priority? &
+       property-recurid? &
+       property-seq? &
+       property-status-todo? &
+       property-summary? &
+
+       property-url? &
+
+       property-rrule? &
+
+       (
+           (property-dtstart?, property-dtend? ) |
+           (property-dtstart, property-duration)?
+       ) &
+
+       property-attach* &
+       property-attendee* &
+       property-categories* &
+       property-comment* &
+       property-contact* &
+       property-exdate* &
+       property-rstatus* &
+       property-related* &
+       property-resources* &
+       property-rdate*
+   }
+
+   # 3.6.3 Journal Component
+
+   component-vjournal = element vjournal {
+       type-jourprop
+   }
+
+   type-jourprop = element properties {
+       property-dtstamp &
+       property-uid &
+
+       property-class? &
+       property-created? &
+       property-dtstart? &
+       property-last-mod? &
+       property-organizer? &
+       property-recurid? &
+       property-seq? &
+       property-status-jour? &
+       property-summary? &
+       property-url? &
+
+       property-rrule? &
+
+       property-attach* &
+       property-attendee* &
+       property-categories* &
+       property-comment* &
+       property-contact* &
+       property-description? &
+       property-exdate* &
+       property-related* &
+       property-rdate* &
+       property-rstatus*
+   }
+
+   # 3.6.4 Free/Busy Component
+
+   component-vfreebusy = element vfreebusy {
+       type-fbprop
+   }
+
+   type-fbprop = element properties {
+       property-dtstamp &
+       property-uid &
+
+       property-contact? &
+       property-dtstart? &
+       property-dtend? &
+       property-duration? &
+       property-organizer? &
+       property-url? &
+
+       property-attendee* &
+       property-comment* &
+       property-freebusy* &
+       property-rstatus*
+   }
+
+   # 3.6.5 Time Zone Component
+
+   component-vtimezone = element vtimezone {
+       element properties {
+           property-tzid &
+
+           property-last-mod? &
+       # mbaudier - 2022-05-31 : corrected undefined reference from RFC 6321
+           property-tzurl?
+       },
+       element components {
+           (component-standard | component-daylight) &
+           component-standard* &
+           component-daylight*
+       }
+   }
+
+   component-standard = element standard {
+       type-tzprop
+   }
+
+   component-daylight = element daylight {
+       type-tzprop
+   }
+
+   type-tzprop = element properties {
+       property-dtstart &
+       property-tzoffsetto &
+       property-tzoffsetfrom &
+
+       property-rrule? &
+
+       property-comment* &
+       property-rdate* &
+       property-tzname*
+   }
+
+   # 3.6.6 Alarm Component
+
+   component-valarm = element valarm {
+       # mbaudier - 2022-05-31 : corrected undefined reference from RFC 6321
+       type-audioprop | type-dispprop | type-emailprop
+   }
+
+   type-audioprop = element properties {
+       property-action &
+
+       property-trigger &
+
+       (property-duration, property-repeat)? &
+
+       property-attach?
+   }
+
+   type-dispprop = element properties {
+       property-action &
+       property-description &
+       property-trigger &
+       property-summary &
+
+       property-attendee+ &
+
+       (property-duration, property-repeat)? &
+
+       property-attach*
+   }
+
+   type-emailprop = element properties {
+       property-action &
+       property-description &
+       property-trigger &
+
+       (property-duration, property-repeat)?
+   }
+
+   # 3.7 Calendar Properties
+
+   # 3.7.1 Calendar Scale
+
+   property-calscale = element calscale {
+
+       element parameters { empty }?,
+
+       element text { "GREGORIAN" }
+   }
+
+   # 3.7.2 Method
+
+   property-method = element method {
+
+       element parameters { empty }?,
+
+       value-text
+   }
+
+   # 3.7.3 Product Identifier
+
+   property-prodid = element prodid {
+
+       element parameters { empty }?,
+
+       value-text
+   }
+
+   # 3.7.4 Version
+
+   property-version = element version {
+
+       element parameters { empty }?,
+
+       element text { "2.0" }
+   }
+
+   # 3.8 Component Properties
+
+   # 3.8.1 Descriptive Component Properties
+
+   # 3.8.1.1 Attachment
+
+   property-attach = element attach {
+
+       element parameters {
+           fmttypeparam? &
+           encodingparam?
+       }?,
+
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+       (value-uri |
+       value-binary)
+   }
+
+   # 3.8.1.2 Categories
+
+   property-categories = element categories {
+
+       element parameters {
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+           languageparam? 
+       }?,
+
+       value-text+
+   }
+
+   # 3.8.1.3 Classification
+
+   property-class = element class {
+
+       element parameters { empty }?,
+
+       element text {
+           "PUBLIC" |
+           "PRIVATE" |
+           "CONFIDENTIAL"
+       }
+   }
+
+   # 3.8.1.4 Comment
+
+   property-comment = element comment {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.1.5 Description
+
+   property-description = element description {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.1.6 Geographic Position
+
+   property-geo = element geo {
+
+       element parameters { empty }?,
+
+       element latitude  { xsd:float },
+       element longitude { xsd:float }
+   }
+
+   # 3.8.1.7 Location
+
+   property-location = element location {
+
+       element parameters {
+
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.1.8 Percent Complete
+
+   property-percent = element percent-complete {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+
+   # 3.8.1.9 Priority
+
+   property-priority = element priority {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+   # 3.8.1.10 Resources
+
+   property-resources = element resources {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text+
+   }
+
+   # 3.8.1.11 Status
+
+   property-status-event = element status {
+
+       element parameters { empty }?,
+
+       element text {
+           "TENTATIVE" |
+           "CONFIRMED" |
+           "CANCELLED"
+       }
+   }
+
+   property-status-todo = element status {
+
+       element parameters { empty }?,
+
+       element text {
+           "NEEDS-ACTION" |
+           "COMPLETED" |
+           "IN-PROCESS" |
+           "CANCELLED"
+       }
+   }
+
+   property-status-jour = element status {
+
+       element parameters { empty }?,
+
+       element text {
+           "DRAFT" |
+           "FINAL" |
+           "CANCELLED"
+       }
+   }
+
+   # 3.8.1.12 Summary
+
+   property-summary = element summary {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.2 Date and Time Component Properties
+
+   # 3.8.2.1 Date/Time Completed
+
+   property-completed = element completed {
+
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.2.2 Date/Time End
+
+   property-dtend = element dtend {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+       (value-date-time |
+       value-date)
+   }
+
+   # 3.8.2.3 Date/Time Due
+
+   property-due = element due {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+       (value-date-time |
+       value-date)
+   }
+
+   # 3.8.2.4 Date/Time Start
+
+   property-dtstart = element dtstart {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+       (value-date-time |
+       value-date)
+   }
+
+   # 3.8.2.5 Duration
+
+   property-duration = element duration {
+
+       element parameters { empty }?,
+
+       value-duration
+   }
+
+   # 3.8.2.6 Free/Busy Time
+
+   property-freebusy = element freebusy {
+
+       element parameters {
+           fbtypeparam?
+       }?,
+
+
+       value-period+
+   }
+
+   # 3.8.2.7 Time Transparency
+
+   property-transp = element transp {
+
+
+       element parameters { empty }?,
+
+       element text {
+           "OPAQUE" |
+           "TRANSPARENT"
+       }
+   }
+
+   # 3.8.3 Time Zone Component Properties
+
+   # 3.8.3.1 Time Zone Identifier
+
+   property-tzid = element tzid {
+
+       element parameters { empty }?,
+
+       value-text
+   }
+
+   # 3.8.3.2 Time Zone Name
+
+   property-tzname = element tzname {
+
+       element parameters {
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.3.3 Time Zone Offset From
+
+   property-tzoffsetfrom = element tzoffsetfrom {
+
+       element parameters { empty }?,
+
+       value-utc-offset
+   }
+
+   # 3.8.3.4 Time Zone Offset To
+
+   property-tzoffsetto = element tzoffsetto {
+
+       element parameters { empty }?,
+
+       value-utc-offset
+   }
+
+   # 3.8.3.5 Time Zone URL
+
+   property-tzurl = element tzurl {
+
+       element parameters { empty }?,
+
+       value-uri
+   }
+
+   # 3.8.4 Relationship Component Properties
+
+   # 3.8.4.1 Attendee
+
+   property-attendee = element attendee {
+
+       element parameters {
+           cutypeparam? &
+           memberparam? &
+           roleparam? &
+           partstatparam? &
+           rsvpparam? &
+           deltoparam? &
+           delfromparam? &
+           sentbyparam? &
+           cnparam? &
+           dirparam? &
+           languageparam?
+       }?,
+
+       value-cal-address
+   }
+
+   # 3.8.4.2 Contact
+
+   property-contact = element contact {
+
+       element parameters {
+           altrepparam? &
+           languageparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.4.3 Organizer
+
+   property-organizer = element organizer {
+
+       element parameters {
+           cnparam? &
+           dirparam? &
+           sentbyparam? &
+           languageparam?
+       }?,
+
+       value-cal-address
+   }
+
+   # 3.8.4.4 Recurrence ID
+
+   property-recurid = element recurrence-id {
+
+       element parameters {
+           tzidparam? &
+           rangeparam?
+       }?,
+
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+       (value-date-time |
+       value-date)
+   }
+
+   # 3.8.4.5 Related-To
+
+   property-related = element related-to {
+
+       element parameters {
+           reltypeparam?
+       }?,
+
+       value-text
+   }
+
+   # 3.8.4.6 Uniform Resource Locator
+
+   property-url = element url {
+
+       element parameters { empty }?,
+
+       value-uri
+   }
+
+   # 3.8.4.7 Unique Identifier
+
+   property-uid = element uid {
+
+       element parameters { empty }?,
+       value-text
+   }
+
+   # 3.8.5 Recurrence Component Properties
+
+   # 3.8.5.1 Exception Date/Times
+
+   property-exdate = element exdate {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+       (value-date-time+ |
+       value-date+)
+   }
+
+   # 3.8.5.2 Recurrence Date/Times
+
+   property-rdate = element rdate {
+
+       element parameters {
+           tzidparam?
+       }?,
+
+       # mbaudier - 2022-05-31 : corrected syntax error from RFC 6321
+       (value-date-time+ |
+       value-date+ |
+       value-period+)
+   }
+
+   # 3.8.5.3 Recurrence Rule
+
+   property-rrule = element rrule {
+
+       element parameters { empty }?,
+
+       value-recur
+   }
+
+   # 3.8.6 Alarm Component Properties
+
+   # 3.8.6.1 Action
+
+   property-action = element action {
+
+       element parameters { empty }?,
+       element text {
+           "AUDIO" |
+           "DISPLAY" |
+           "EMAIL"
+       }
+   }
+
+   # 3.8.6.2 Repeat Count
+
+   property-repeat = element repeat {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+   # 3.8.6.3 Trigger
+
+   property-trigger = element trigger {
+
+       (
+           element parameters {
+               trigrelparam?
+           }?,
+
+           value-duration
+       ) |
+       (
+           element parameters { empty }?,
+
+           value-date-time
+       )
+   }
+
+   # 3.8.7 Change Management Component Properties
+
+   # 3.8.7.1 Date/Time Created
+
+   property-created = element created {
+
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.7.2 Date/Time Stamp
+
+   property-dtstamp = element dtstamp {
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.7.3 Last Modified
+
+   property-last-mod = element last-modified {
+
+       element parameters { empty }?,
+
+       value-date-time
+   }
+
+   # 3.8.7.4 Sequence Number
+
+   property-seq = element sequence {
+
+       element parameters { empty }?,
+
+       value-integer
+   }
+
+   # 3.8.8 Miscellaneous Component Properties
+
+   # 3.8.8.3 Request Status
+
+   property-rstatus = element request-status {
+
+       element parameters {
+           languageparam?
+       }?,
+
+       element code { xsd:string },
+       element description { xsd:string },
+       element data { xsd:string }?
+   }
+
+
+
+
+
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/xCal-2.0.xsd
new file mode 100644 (file)
index 0000000..d0bb31e
--- /dev/null
@@ -0,0 +1,1489 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:ietf:params:xml:ns:icalendar-2.0" xmlns:ns1="urn:ietf:params:xml:ns:icalendar-2.0">
+  <!-- 3.2 Property Parameters -->
+  <!-- 3.2.1 Alternate Text Representation -->
+  <xs:element name="altrep">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.2 Common Name -->
+  <xs:element name="cn">
+    <xs:complexType>
+      <xs:group ref="ns1:value-text"/>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.3 Calendar User Type -->
+  <xs:element name="cutype">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="INDIVIDUAL"/>
+              <xs:enumeration value="GROUP"/>
+              <xs:enumeration value="RESOURCE"/>
+              <xs:enumeration value="ROOM"/>
+              <xs:enumeration value="UNKNOWN"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.4 Delegators -->
+  <xs:element name="delegated-from">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="ns1:cal-address"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.5 Delegatees -->
+  <xs:element name="delegated-to">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="ns1:cal-address"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.6 Directory Entry Reference -->
+  <xs:element name="dir">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.7 Inline Encoding -->
+  <xs:element name="encoding">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="8BIT"/>
+              <xs:enumeration value="BASE64"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.8 Format Type -->
+  <xs:element name="fmttype">
+    <xs:complexType>
+      <xs:group ref="ns1:value-text"/>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.9 Free/Busy Time Type -->
+  <xs:element name="fbtype">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="FREE"/>
+              <xs:enumeration value="BUSY"/>
+              <xs:enumeration value="BUSY-UNAVAILABLE"/>
+              <xs:enumeration value="BUSY-TENTATIVE"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.10 Language -->
+  <xs:element name="language">
+    <xs:complexType>
+      <xs:group ref="ns1:value-text"/>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.11 Group or List Membership -->
+  <xs:element name="member">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="ns1:cal-address"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.12 Participation Status -->
+  <xs:element name="partstat">
+    <xs:complexType>
+      <xs:choice>
+        <xs:group ref="ns1:type-partstat-event"/>
+        <xs:group ref="ns1:type-partstat-todo"/>
+        <xs:group ref="ns1:type-partstat-jour"/>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <xs:group name="type-partstat-event">
+    <xs:sequence>
+      <xs:element name="text">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="NEEDS-ACTION"/>
+            <xs:enumeration value="ACCEPTED"/>
+            <xs:enumeration value="DECLINED"/>
+            <xs:enumeration value="TENTATIVE"/>
+            <xs:enumeration value="DELEGATED"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <xs:group name="type-partstat-todo">
+    <xs:sequence>
+      <xs:element name="text">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="NEEDS-ACTION"/>
+            <xs:enumeration value="ACCEPTED"/>
+            <xs:enumeration value="DECLINED"/>
+            <xs:enumeration value="TENTATIVE"/>
+            <xs:enumeration value="DELEGATED"/>
+            <xs:enumeration value="COMPLETED"/>
+            <xs:enumeration value="IN-PROCESS"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <xs:group name="type-partstat-jour">
+    <xs:sequence>
+      <xs:element name="text">
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:enumeration value="NEEDS-ACTION"/>
+            <xs:enumeration value="ACCEPTED"/>
+            <xs:enumeration value="DECLINED"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.2.13 Recurrence Identifier Range -->
+  <xs:element name="range">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="THISANDFUTURE"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.14 Alarm Trigger Relationship -->
+  <xs:element name="related">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="START"/>
+              <xs:enumeration value="END"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.15 Relationship Type -->
+  <xs:element name="reltype">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="PARENT"/>
+              <xs:enumeration value="CHILD"/>
+              <xs:enumeration value="SIBLING"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.16 Participation Role -->
+  <xs:element name="role">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="CHAIR"/>
+              <xs:enumeration value="REQ-PARTICIPANT"/>
+              <xs:enumeration value="OPT-PARTICIPANT"/>
+              <xs:enumeration value="NON-PARTICIPANT"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.17 RSVP Expectation -->
+  <xs:element name="rsvp" type="ns1:value-boolean"/>
+  <!-- 3.2.18 Sent By -->
+  <xs:element name="sent-by">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:cal-address"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.2.19 Time Zone Identifier -->
+  <xs:group name="tzidparam">
+    <xs:sequence>
+      <xs:element name="tzid">
+        <xs:complexType>
+          <xs:group ref="ns1:value-text"/>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.3 Property Value Data Types -->
+  <!-- 3.3.1 BINARY -->
+  <xs:element name="binary" type="xs:string"/>
+  <!-- 3.3.2 BOOLEAN -->
+  <xs:complexType name="value-boolean">
+    <xs:sequence>
+      <xs:element ref="ns1:boolean"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="boolean" type="xs:boolean"/>
+  <!-- 3.3.3 CAL-ADDRESS -->
+  <xs:element name="cal-address" type="xs:anyURI"/>
+  <!-- 3.3.4 DATE -->
+  <xs:simpleType name="pattern-date">
+    <xs:restriction base="xs:string">
+      <xs:pattern value="\d\d\d\d-\d\d-\d\d"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="date" type="ns1:pattern-date"/>
+  <!-- 3.3.5 DATE-TIME -->
+  <xs:simpleType name="pattern-date-time">
+    <xs:restriction base="xs:string">
+      <xs:pattern value="\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="date-time" type="ns1:pattern-date-time"/>
+  <!-- 3.3.6 DURATION -->
+  <xs:simpleType name="pattern-duration">
+    <xs:restriction base="xs:string">
+      <xs:pattern value="(\+|-)?P(\d+W)|(\d+D)?(T(\d+H(\d+M)?(\d+S)?)|(\d+M(\d+S)?)|(\d+S))?"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:group name="value-duration">
+    <xs:sequence>
+      <xs:element name="duration" type="ns1:pattern-duration"/>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.3.7 FLOAT -->
+  <xs:element name="float" type="xs:float"/>
+  <!-- 3.3.8 INTEGER -->
+  <xs:element name="integer" type="xs:integer"/>
+  <!-- 3.3.9 PERIOD -->
+  <xs:element name="period">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:start"/>
+        <xs:choice>
+          <xs:element ref="ns1:end"/>
+          <xs:element name="duration" type="ns1:pattern-duration"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="start" type="ns1:pattern-date-time"/>
+  <xs:element name="end" type="ns1:pattern-date-time"/>
+  <!-- 3.3.10 RECUR -->
+  <xs:element name="recur">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:freq"/>
+        <xs:choice minOccurs="0">
+          <xs:element ref="ns1:until"/>
+          <xs:element ref="ns1:count"/>
+        </xs:choice>
+        <xs:element minOccurs="0" ref="ns1:interval"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:bysecond"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:byminute"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:byhour"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:byday"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:bymonthday"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:byyearday"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:byweekno"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:bymonth"/>
+        <xs:element minOccurs="0" maxOccurs="unbounded" ref="ns1:bysetpos"/>
+        <xs:element minOccurs="0" ref="ns1:wkst"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="interval" type="xs:positiveInteger"/>
+  <xs:element name="wkst" type="ns1:type-weekday"/>
+  <xs:element name="freq">
+    <xs:simpleType>
+      <xs:restriction base="xs:token">
+        <xs:enumeration value="SECONDLY"/>
+        <xs:enumeration value="MINUTELY"/>
+        <xs:enumeration value="HOURLY"/>
+        <xs:enumeration value="DAILY"/>
+        <xs:enumeration value="WEEKLY"/>
+        <xs:enumeration value="MONTHLY"/>
+        <xs:enumeration value="YEARLY"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <xs:element name="until">
+    <xs:complexType>
+      <xs:choice>
+        <xs:element ref="ns1:date"/>
+        <xs:element ref="ns1:date-time"/>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="count" type="xs:positiveInteger"/>
+  <xs:element name="bysecond" type="xs:positiveInteger"/>
+  <xs:element name="byminute" type="xs:positiveInteger"/>
+  <xs:element name="byhour" type="xs:positiveInteger"/>
+  <xs:simpleType name="type-weekday">
+    <xs:restriction base="xs:token">
+      <xs:enumeration value="SU"/>
+      <xs:enumeration value="MO"/>
+      <xs:enumeration value="TU"/>
+      <xs:enumeration value="WE"/>
+      <xs:enumeration value="TH"/>
+      <xs:enumeration value="FR"/>
+      <xs:enumeration value="SA"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="byday">
+    <xs:simpleType>
+      <xs:union>
+        <xs:simpleType>
+          <xs:union memberTypes="xs:integer ns1:type-weekday"/>
+        </xs:simpleType>
+        <xs:simpleType>
+          <xs:restriction base="xs:token">
+            <xs:length value="0"/>
+          </xs:restriction>
+        </xs:simpleType>
+      </xs:union>
+    </xs:simpleType>
+  </xs:element>
+  <xs:element name="bymonthday" type="xs:integer"/>
+  <xs:element name="byyearday" type="xs:integer"/>
+  <xs:element name="byweekno" type="xs:integer"/>
+  <xs:element name="bymonth" type="xs:positiveInteger"/>
+  <xs:element name="bysetpos" type="xs:integer"/>
+  <!-- 3.3.11 TEXT -->
+  <xs:group name="value-text">
+    <xs:sequence>
+      <xs:element name="text" type="xs:string"/>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.3.12 TIME -->
+  <xs:simpleType name="pattern-time">
+    <xs:restriction base="xs:string">
+      <xs:pattern value="\d\d:\d\d:\d\dZ?"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <xs:element name="time" type="ns1:pattern-time"/>
+  <!-- 3.3.13 URI -->
+  <xs:element name="uri" type="xs:anyURI"/>
+  <!-- 3.3.14 UTC-OFFSET -->
+  <xs:element name="utc-offset">
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:pattern value="(\+|-)\d\d:\d\d(:\d\d)?"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <!-- UNKNOWN -->
+  <xs:element name="unknown" type="xs:string"/>
+  <!-- 3.4 iCalendar Stream -->
+  <xs:element name="icalendar">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="ns1:vcalendar"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.6 Calendar Components -->
+  <xs:element name="vcalendar">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:group ref="ns1:type-calprops"/>
+        <xs:element ref="ns1:components"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:group name="type-calprops">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:prodid"/>
+            <xs:element ref="ns1:version"/>
+            <xs:element ref="ns1:calscale"/>
+            <xs:element ref="ns1:method"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="components">
+    <xs:complexType>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element ref="ns1:vevent"/>
+        <xs:element ref="ns1:vtodo"/>
+        <xs:element ref="ns1:vjournal"/>
+        <xs:element ref="ns1:vfreebusy"/>
+        <xs:element ref="ns1:vtimezone"/>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.6.1 Event Component -->
+  <xs:element name="vevent">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:group ref="ns1:type-eventprop"/>
+        <xs:element minOccurs="0" name="components">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="ns1:valarm"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:group name="type-eventprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:dtstamp"/>
+            <xs:element ref="ns1:dtstart"/>
+            <xs:element ref="ns1:uid"/>
+            <xs:element ref="ns1:class"/>
+            <xs:element ref="ns1:created"/>
+            <xs:element ref="ns1:description"/>
+            <xs:element ref="ns1:geo"/>
+            <xs:element ref="ns1:last-modified"/>
+            <xs:element ref="ns1:location"/>
+            <xs:element ref="ns1:organizer"/>
+            <xs:element ref="ns1:priority"/>
+            <xs:element ref="ns1:sequence"/>
+            <xs:group ref="ns1:property-status-event"/>
+            <xs:element ref="ns1:summary"/>
+            <xs:element ref="ns1:transp"/>
+            <xs:element ref="ns1:url"/>
+            <xs:element ref="ns1:recurrence-id"/>
+            <xs:element ref="ns1:rrule"/>
+            <xs:choice>
+              <xs:element ref="ns1:dtend"/>
+              <xs:group ref="ns1:property-duration"/>
+            </xs:choice>
+            <xs:element ref="ns1:attach"/>
+            <xs:element ref="ns1:attendee"/>
+            <xs:element ref="ns1:categories"/>
+            <xs:element ref="ns1:comment"/>
+            <xs:element ref="ns1:contact"/>
+            <xs:element ref="ns1:exdate"/>
+            <xs:element ref="ns1:request-status"/>
+            <xs:element ref="ns1:related-to"/>
+            <xs:element ref="ns1:resources"/>
+            <xs:element ref="ns1:rdate"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.6.2 To-do Component -->
+  <xs:element name="vtodo">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:group ref="ns1:type-todoprop"/>
+        <xs:element minOccurs="0" name="components">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element maxOccurs="unbounded" ref="ns1:valarm"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:group name="type-todoprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:dtstamp"/>
+            <xs:element ref="ns1:uid"/>
+            <xs:element ref="ns1:class"/>
+            <xs:element ref="ns1:completed"/>
+            <xs:element ref="ns1:created"/>
+            <xs:element ref="ns1:description"/>
+            <xs:element ref="ns1:geo"/>
+            <xs:element ref="ns1:last-modified"/>
+            <xs:element ref="ns1:location"/>
+            <xs:element ref="ns1:organizer"/>
+            <xs:element ref="ns1:percent-complete"/>
+            <xs:element ref="ns1:priority"/>
+            <xs:element ref="ns1:recurrence-id"/>
+            <xs:element ref="ns1:sequence"/>
+            <xs:group ref="ns1:property-status-todo"/>
+            <xs:element ref="ns1:summary"/>
+            <xs:element ref="ns1:url"/>
+            <xs:element ref="ns1:rrule"/>
+            <xs:choice>
+              <xs:choice>
+                <xs:element ref="ns1:dtstart"/>
+                <xs:element ref="ns1:dtend"/>
+              </xs:choice>
+              <xs:choice>
+                <xs:element ref="ns1:dtstart"/>
+                <xs:group ref="ns1:property-duration"/>
+              </xs:choice>
+            </xs:choice>
+            <xs:element ref="ns1:attach"/>
+            <xs:element ref="ns1:attendee"/>
+            <xs:element ref="ns1:categories"/>
+            <xs:element ref="ns1:comment"/>
+            <xs:element ref="ns1:contact"/>
+            <xs:element ref="ns1:exdate"/>
+            <xs:element ref="ns1:request-status"/>
+            <xs:element ref="ns1:related-to"/>
+            <xs:element ref="ns1:resources"/>
+            <xs:element ref="ns1:rdate"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.6.3 Journal Component -->
+  <xs:element name="vjournal" type="ns1:type-jourprop"/>
+  <xs:complexType name="type-jourprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:dtstamp"/>
+            <xs:element ref="ns1:uid"/>
+            <xs:element ref="ns1:class"/>
+            <xs:element ref="ns1:created"/>
+            <xs:element ref="ns1:dtstart"/>
+            <xs:element ref="ns1:last-modified"/>
+            <xs:element ref="ns1:organizer"/>
+            <xs:element ref="ns1:recurrence-id"/>
+            <xs:element ref="ns1:sequence"/>
+            <xs:group ref="ns1:property-status-jour"/>
+            <xs:element ref="ns1:summary"/>
+            <xs:element ref="ns1:url"/>
+            <xs:element ref="ns1:rrule"/>
+            <xs:element ref="ns1:attach"/>
+            <xs:element ref="ns1:attendee"/>
+            <xs:element ref="ns1:categories"/>
+            <xs:element ref="ns1:comment"/>
+            <xs:element ref="ns1:contact"/>
+            <xs:element ref="ns1:description"/>
+            <xs:element ref="ns1:exdate"/>
+            <xs:element ref="ns1:related-to"/>
+            <xs:element ref="ns1:rdate"/>
+            <xs:element ref="ns1:request-status"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <!-- 3.6.4 Free/Busy Component -->
+  <xs:element name="vfreebusy" type="ns1:type-fbprop"/>
+  <xs:complexType name="type-fbprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:dtstamp"/>
+            <xs:element ref="ns1:uid"/>
+            <xs:element ref="ns1:contact"/>
+            <xs:element ref="ns1:dtstart"/>
+            <xs:element ref="ns1:dtend"/>
+            <xs:group ref="ns1:property-duration"/>
+            <xs:element ref="ns1:organizer"/>
+            <xs:element ref="ns1:url"/>
+            <xs:element ref="ns1:attendee"/>
+            <xs:element ref="ns1:comment"/>
+            <xs:element ref="ns1:freebusy"/>
+            <xs:element ref="ns1:request-status"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <!-- 3.6.5 Time Zone Component -->
+  <xs:element name="vtimezone">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="properties">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:group ref="ns1:property-tzid"/>
+              <xs:element ref="ns1:last-modified"/>
+              <xs:element ref="ns1:tzurl"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:element name="components">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:choice>
+                <xs:element ref="ns1:standard"/>
+                <xs:element ref="ns1:daylight"/>
+              </xs:choice>
+              <xs:element ref="ns1:standard"/>
+              <xs:element ref="ns1:daylight"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="standard" type="ns1:type-tzprop"/>
+  <xs:element name="daylight" type="ns1:type-tzprop"/>
+  <xs:complexType name="type-tzprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:dtstart"/>
+            <xs:element ref="ns1:tzoffsetto"/>
+            <xs:element ref="ns1:tzoffsetfrom"/>
+            <xs:element ref="ns1:rrule"/>
+            <xs:element ref="ns1:comment"/>
+            <xs:element ref="ns1:rdate"/>
+            <xs:element ref="ns1:tzname"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+  <!-- 3.6.6 Alarm Component -->
+  <xs:element name="valarm">
+    <xs:complexType>
+      <xs:choice>
+        <xs:group ref="ns1:type-audioprop"/>
+        <xs:group ref="ns1:type-dispprop"/>
+        <xs:group ref="ns1:type-emailprop"/>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <xs:group name="type-audioprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:action"/>
+            <xs:element ref="ns1:trigger"/>
+            <xs:choice>
+              <xs:group ref="ns1:property-duration"/>
+              <xs:element ref="ns1:repeat"/>
+            </xs:choice>
+            <xs:element ref="ns1:attach"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <xs:group name="type-dispprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:action"/>
+            <xs:element ref="ns1:description"/>
+            <xs:element ref="ns1:trigger"/>
+            <xs:element ref="ns1:summary"/>
+            <xs:element ref="ns1:attendee"/>
+            <xs:choice>
+              <xs:group ref="ns1:property-duration"/>
+              <xs:element ref="ns1:repeat"/>
+            </xs:choice>
+            <xs:element ref="ns1:attach"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <xs:group name="type-emailprop">
+    <xs:sequence>
+      <xs:element name="properties">
+        <xs:complexType>
+          <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element ref="ns1:action"/>
+            <xs:element ref="ns1:description"/>
+            <xs:element ref="ns1:trigger"/>
+            <xs:choice>
+              <xs:group ref="ns1:property-duration"/>
+              <xs:element ref="ns1:repeat"/>
+            </xs:choice>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.7 Calendar Properties -->
+  <!-- 3.7.1 Calendar Scale -->
+  <xs:element name="calscale">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="GREGORIAN"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.7.2 Method -->
+  <xs:element name="method">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.7.3 Product Identifier -->
+  <xs:element name="prodid">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.7.4 Version -->
+  <xs:element name="version">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="2.0"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8 Component Properties -->
+  <!-- 3.8.1 Descriptive Component Properties -->
+  <!-- 3.8.1.1 Attachment -->
+  <xs:element name="attach">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:fmttype"/>
+              <xs:element ref="ns1:encoding"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:uri"/>
+          <xs:element ref="ns1:binary"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.2 Categories -->
+  <xs:element name="categories">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element minOccurs="0" ref="ns1:language"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:group maxOccurs="unbounded" ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.3 Classification -->
+  <xs:element name="class">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="PUBLIC"/>
+              <xs:enumeration value="PRIVATE"/>
+              <xs:enumeration value="CONFIDENTIAL"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.4 Comment -->
+  <xs:element name="comment">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:altrep"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.5 Description -->
+  <xs:element name="description">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:altrep"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.6 Geographic Position -->
+  <xs:element name="geo">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:latitude"/>
+        <xs:element ref="ns1:longitude"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="latitude" type="xs:float"/>
+  <xs:element name="longitude" type="xs:float"/>
+  <!-- 3.8.1.7 Location -->
+  <xs:element name="location">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:altrep"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.8 Percent Complete -->
+  <xs:element name="percent-complete">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:integer"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.9 Priority -->
+  <xs:element name="priority">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:integer"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.10 Resources -->
+  <xs:element name="resources">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:altrep"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:group maxOccurs="unbounded" ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.1.11 Status -->
+  <xs:group name="property-status-event">
+    <xs:sequence>
+      <xs:element name="status">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" name="parameters">
+              <xs:complexType/>
+            </xs:element>
+            <xs:element name="text">
+              <xs:simpleType>
+                <xs:restriction base="xs:token">
+                  <xs:enumeration value="TENTATIVE"/>
+                  <xs:enumeration value="CONFIRMED"/>
+                  <xs:enumeration value="CANCELLED"/>
+                </xs:restriction>
+              </xs:simpleType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <xs:group name="property-status-todo">
+    <xs:sequence>
+      <xs:element name="status">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" name="parameters">
+              <xs:complexType/>
+            </xs:element>
+            <xs:element name="text">
+              <xs:simpleType>
+                <xs:restriction base="xs:token">
+                  <xs:enumeration value="NEEDS-ACTION"/>
+                  <xs:enumeration value="COMPLETED"/>
+                  <xs:enumeration value="IN-PROCESS"/>
+                  <xs:enumeration value="CANCELLED"/>
+                </xs:restriction>
+              </xs:simpleType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <xs:group name="property-status-jour">
+    <xs:sequence>
+      <xs:element name="status">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" name="parameters">
+              <xs:complexType/>
+            </xs:element>
+            <xs:element name="text">
+              <xs:simpleType>
+                <xs:restriction base="xs:token">
+                  <xs:enumeration value="DRAFT"/>
+                  <xs:enumeration value="FINAL"/>
+                  <xs:enumeration value="CANCELLED"/>
+                </xs:restriction>
+              </xs:simpleType>
+            </xs:element>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.8.1.12 Summary -->
+  <xs:element name="summary">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:altrep"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.2 Date and Time Component Properties -->
+  <!-- 3.8.2.1 Date/Time Completed -->
+  <xs:element name="completed">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:date-time"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.2.2 Date/Time End -->
+  <xs:element name="dtend">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:group minOccurs="0" ref="ns1:tzidparam"/>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:date-time"/>
+          <xs:element ref="ns1:date"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.2.3 Date/Time Due -->
+  <xs:element name="due">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:group minOccurs="0" ref="ns1:tzidparam"/>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:date-time"/>
+          <xs:element ref="ns1:date"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.2.4 Date/Time Start -->
+  <xs:element name="dtstart">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:group minOccurs="0" ref="ns1:tzidparam"/>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:date-time"/>
+          <xs:element ref="ns1:date"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.2.5 Duration -->
+  <xs:group name="property-duration">
+    <xs:sequence>
+      <xs:element name="duration">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" name="parameters">
+              <xs:complexType/>
+            </xs:element>
+            <xs:group ref="ns1:value-duration"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.8.2.6 Free/Busy Time -->
+  <xs:element name="freebusy">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element minOccurs="0" ref="ns1:fbtype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element maxOccurs="unbounded" ref="ns1:period"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.2.7 Time Transparency -->
+  <xs:element name="transp">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="OPAQUE"/>
+              <xs:enumeration value="TRANSPARENT"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.3 Time Zone Component Properties -->
+  <!-- 3.8.3.1 Time Zone Identifier -->
+  <xs:group name="property-tzid">
+    <xs:sequence>
+      <xs:element name="tzid">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" name="parameters">
+              <xs:complexType/>
+            </xs:element>
+            <xs:group ref="ns1:value-text"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 3.8.3.2 Time Zone Name -->
+  <xs:element name="tzname">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element minOccurs="0" ref="ns1:language"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.3.3 Time Zone Offset From -->
+  <xs:element name="tzoffsetfrom">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:utc-offset"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.3.4 Time Zone Offset To -->
+  <xs:element name="tzoffsetto">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:utc-offset"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.3.5 Time Zone URL -->
+  <xs:element name="tzurl">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.4 Relationship Component Properties -->
+  <!-- 3.8.4.1 Attendee -->
+  <xs:element name="attendee">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:cutype"/>
+              <xs:element ref="ns1:member"/>
+              <xs:element ref="ns1:role"/>
+              <xs:element ref="ns1:partstat"/>
+              <xs:element ref="ns1:rsvp"/>
+              <xs:element ref="ns1:delegated-to"/>
+              <xs:element ref="ns1:delegated-from"/>
+              <xs:element ref="ns1:sent-by"/>
+              <xs:element ref="ns1:cn"/>
+              <xs:element ref="ns1:dir"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:cal-address"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.4.2 Contact -->
+  <xs:element name="contact">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:altrep"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.4.3 Organizer -->
+  <xs:element name="organizer">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:element ref="ns1:cn"/>
+              <xs:element ref="ns1:dir"/>
+              <xs:element ref="ns1:sent-by"/>
+              <xs:element ref="ns1:language"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:cal-address"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.4.4 Recurrence ID -->
+  <xs:element name="recurrence-id">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+              <xs:group ref="ns1:tzidparam"/>
+              <xs:element ref="ns1:range"/>
+            </xs:choice>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:date-time"/>
+          <xs:element ref="ns1:date"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.4.5 Related-To -->
+  <xs:element name="related-to">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element minOccurs="0" ref="ns1:reltype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.4.6 Uniform Resource Locator -->
+  <xs:element name="url">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.4.7 Unique Identifier -->
+  <xs:element name="uid">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:group ref="ns1:value-text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.5 Recurrence Component Properties -->
+  <!-- 3.8.5.1 Exception Date/Times -->
+  <xs:element name="exdate">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:group minOccurs="0" ref="ns1:tzidparam"/>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="ns1:date-time"/>
+          <xs:element maxOccurs="unbounded" ref="ns1:date"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.5.2 Recurrence Date/Times -->
+  <xs:element name="rdate">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:group minOccurs="0" ref="ns1:tzidparam"/>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element maxOccurs="unbounded" ref="ns1:date-time"/>
+          <xs:element maxOccurs="unbounded" ref="ns1:date"/>
+          <xs:element maxOccurs="unbounded" ref="ns1:period"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.5.3 Recurrence Rule -->
+  <xs:element name="rrule">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:recur"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.6 Alarm Component Properties -->
+  <!-- 3.8.6.1 Action -->
+  <xs:element name="action">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="AUDIO"/>
+              <xs:enumeration value="DISPLAY"/>
+              <xs:enumeration value="EMAIL"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.6.2 Repeat Count -->
+  <xs:element name="repeat">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:integer"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.6.3 Trigger -->
+  <xs:element name="trigger">
+    <xs:complexType>
+      <xs:choice>
+        <xs:sequence>
+          <xs:element minOccurs="0" name="parameters">
+            <xs:complexType>
+              <xs:sequence>
+                <xs:element minOccurs="0" ref="ns1:related"/>
+              </xs:sequence>
+            </xs:complexType>
+          </xs:element>
+          <xs:group ref="ns1:value-duration"/>
+        </xs:sequence>
+        <xs:sequence>
+          <xs:element minOccurs="0" name="parameters">
+            <xs:complexType/>
+          </xs:element>
+          <xs:element ref="ns1:date-time"/>
+        </xs:sequence>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.7 Change Management Component Properties -->
+  <!-- 3.8.7.1 Date/Time Created -->
+  <xs:element name="created">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:date-time"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.7.2 Date/Time Stamp -->
+  <xs:element name="dtstamp">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:date-time"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.7.3 Last Modified -->
+  <xs:element name="last-modified">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:date-time"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.7.4 Sequence Number -->
+  <xs:element name="sequence">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType/>
+        </xs:element>
+        <xs:element ref="ns1:integer"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 3.8.8 Miscellaneous Component Properties -->
+  <!-- 3.8.8.3 Request Status -->
+  <xs:element name="request-status">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element minOccurs="0" ref="ns1:language"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:code"/>
+        <xs:element name="description" type="xs:string"/>
+        <xs:element minOccurs="0" ref="ns1:data"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="code" type="xs:string"/>
+  <xs:element name="data" type="xs:string"/>
+</xs:schema>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0-RFC6351.rnc b/org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0-RFC6351.rnc
new file mode 100644 (file)
index 0000000..9f4f163
--- /dev/null
@@ -0,0 +1,382 @@
+default namespace = "urn:ietf:params:xml:ns:vcard-4.0"
+
+### Section 3.3: vCard Format Specification
+#
+# 3.3
+iana-token = xsd:string { pattern = "[a-zA-Z0-9-]+" }
+x-name = xsd:string { pattern = "x-[a-zA-Z0-9-]+" }
+
+### Section 4: Value types
+#
+# 4.1
+value-text = element text { text }
+value-text-list = value-text+
+
+# 4.2
+value-uri = element uri { xsd:anyURI }
+
+# 4.3.1
+value-date = element date {
+    xsd:string { pattern = "\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d" }
+  }
+
+# 4.3.2
+value-time = element time {
+    xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)"
+                         ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+  }
+
+# 4.3.3
+value-date-time = element date-time {
+    xsd:string { pattern = "(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?"
+                         ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+  }
+
+# 4.3.4
+value-date-and-or-time = value-date | value-date-time | value-time
+
+# 4.3.5
+value-timestamp = element timestamp {
+    xsd:string { pattern = "\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?" }
+  }
+
+# 4.4
+value-boolean = element boolean { xsd:boolean }
+
+# 4.5
+value-integer = element integer { xsd:integer }
+
+# 4.6
+value-float = element float { xsd:float }
+
+# 4.7
+value-utc-offset = element utc-offset {
+    xsd:string { pattern = "[+\-]\d\d(\d\d)?" }
+  }
+
+# 4.8
+value-language-tag = element language-tag {
+    xsd:string { pattern = "([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})"
+                         ~ "(-[a-z]{4})?(-([a-z]{2}|\d{3}))?"
+                         ~ "(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*"
+                         ~ "(-[0-9a-wyz](-[0-9a-z]{2,8})+)*"
+                         ~ "(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|"
+                         ~ "[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}" }
+  }
+
+### Section 5: Parameters
+#
+# 5.1
+param-language = element language { value-language-tag }?
+
+# 5.2
+param-pref = element pref {
+    element integer {
+      xsd:integer { minInclusive = "1" maxInclusive = "100" }
+    }
+  }?
+
+# 5.4
+param-altid = element altid { value-text }?
+
+# 5.5
+param-pid = element pid {
+    element text { xsd:string { pattern = "\d+(\.\d+)?" } }+
+  }?
+
+# 5.6
+param-type = element type { element text { "work" | "home" }+ }?
+
+# 5.7
+param-mediatype = element mediatype { value-text }?
+
+# 5.8
+param-calscale = element calscale { element text { "gregorian" } }?
+
+# 5.9
+param-sort-as = element sort-as { value-text+ }?
+
+# 5.10
+param-geo = element geo { value-uri }?
+
+# 5.11
+param-tz = element tz { value-text | value-uri }?
+
+### Section 6: Properties
+#
+# 6.1.3
+property-source = element source {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-mediatype },
+    value-uri
+  }
+
+# 6.1.4
+property-kind = element kind {
+    element text { "individual" | "group" | "org" | "location" |
+                   x-name | iana-token }*
+  }
+
+# 6.2.1
+property-fn = element fn {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.2.2
+property-n = element n {
+    element parameters { param-language, param-sort-as, param-altid }?,
+    element surname { text }+,
+    element given { text }+,
+    element additional { text }+,
+    element prefix { text }+,
+    element suffix { text }+
+  }
+
+# 6.2.3
+property-nickname = element nickname {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text-list
+  }
+
+# 6.2.4
+property-photo = element photo {
+    element parameters { param-altid, param-pid, param-pref, param-type,
+                         param-mediatype }?,
+    value-uri
+  }
+
+# 6.2.5
+property-bday = element bday {
+    element parameters { param-altid, param-calscale }?,
+    (value-date-and-or-time | value-text)
+  }
+
+# 6.2.6
+property-anniversary = element anniversary {
+    element parameters { param-altid, param-calscale }?,
+    (value-date-and-or-time | value-text)
+  }
+
+# 6.2.7
+property-gender = element gender {
+    element sex { "" | "M" | "F" | "O" | "N" | "U" },
+    element identity { text }?
+  }
+
+# 6.3.1
+param-label = element label { value-text }?
+property-adr = element adr {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-geo, param-tz,
+                         param-label }?,
+    element pobox { text }+,
+    element ext { text }+,
+    element street { text }+,
+    element locality { text }+,
+    element region { text }+,
+    element code { text }+,
+    element country { text }+
+  }
+
+# 6.4.1
+property-tel = element tel {
+    element parameters {
+      param-altid,
+      param-pid,
+      param-pref,
+      element type {
+        element text { "work" | "home" | "text" | "voice"
+                     | "fax" | "cell" | "video" | "pager"
+                     | "textphone" }+
+      }?,
+      param-mediatype
+    }?,
+    (value-text | value-uri)
+  }
+
+# 6.4.2
+property-email = element email {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type }?,
+    value-text
+  }
+
+# 6.4.3
+property-impp = element impp {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.4.4
+property-lang = element lang {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type }?,
+    value-language-tag
+  }
+
+# 6.5.1
+property-tz = element tz {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    (value-text | value-uri | value-utc-offset)
+  }
+
+# 6.5.2
+property-geo = element geo {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.6.1
+property-title = element title {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.6.2
+property-role = element role {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.6.3
+property-logo = element logo {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.6.4
+property-org = element org {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-sort-as }?,
+    value-text-list
+  }
+
+# 6.6.5
+property-member = element member {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-mediatype }?,
+    value-uri
+  }
+
+# 6.6.6
+property-related = element related {
+    element parameters {
+      param-altid,
+      param-pid,
+      param-pref,
+      element type {
+        element text {
+          "work" | "home" | "contact" | "acquaintance" |
+          "friend" | "met" | "co-worker" | "colleague" | "co-resident" |
+          "neighbor" | "child" | "parent" | "sibling" | "spouse" |
+          "kin" | "muse" | "crush" | "date" | "sweetheart" | "me" |
+          "agent" | "emergency"
+        }+
+      }?,
+      param-mediatype
+    }?,
+    (value-uri | value-text)
+  }
+
+# 6.7.1
+property-categories = element categories {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type }?,
+    value-text-list
+  }
+
+# 6.7.2
+property-note = element note {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.7.3
+property-prodid = element prodid { value-text }
+
+# 6.7.4
+property-rev = element rev { value-timestamp }
+
+# 6.7.5
+property-sound = element sound {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.7.6
+property-uid = element uid { value-uri }
+
+# 6.7.7
+property-clientpidmap = element clientpidmap {
+    element sourceid { xsd:positiveInteger },
+    value-uri
+  }
+
+# 6.7.8
+property-url = element url {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.8.1
+property-key = element key {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    (value-uri | value-text)
+  }
+
+# 6.9.1
+property-fburl = element fburl {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.9.2
+property-caladruri = element caladruri {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.9.3
+property-caluri = element caluri {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# Top-level grammar
+property = property-adr | property-anniversary | property-bday
+         | property-caladruri | property-caluri | property-categories
+         | property-clientpidmap | property-email | property-fburl
+         | property-fn | property-geo | property-impp | property-key
+         | property-kind | property-lang | property-logo
+         | property-member | property-n | property-nickname
+         | property-note | property-org | property-photo
+         | property-prodid | property-related | property-rev
+         | property-role | property-gender | property-sound
+         | property-source | property-tel | property-title
+         | property-tz | property-uid | property-url
+start = element vcards {
+    element vcard {
+      (property
+       | element group {
+           attribute name { text },
+           property*
+         })+
+    }+
+  }
+
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0.rnc b/org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0.rnc
new file mode 100644 (file)
index 0000000..5494882
--- /dev/null
@@ -0,0 +1,385 @@
+default namespace = "urn:ietf:params:xml:ns:vcard-4.0"
+
+### Section 3.3: vCard Format Specification
+#
+# 3.3
+
+# mbaudier - 2022-05-31 : corrected regexp from RFC 6351
+iana-token = xsd:string { pattern = "[a-zA-Z0-9]+" }
+# mbaudier - 2022-05-31 : corrected regexp from RFC 6351
+x-name = xsd:string { pattern = "x-[a-zA-Z0-9]+" }
+
+### Section 4: Value types
+#
+# 4.1
+value-text = element text { text }
+value-text-list = value-text+
+
+# 4.2
+value-uri = element uri { xsd:anyURI }
+
+# 4.3.1
+value-date = element date {
+    xsd:string { pattern = "\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d" }
+  }
+
+# 4.3.2
+value-time = element time {
+    xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)"
+                         ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+  }
+
+# 4.3.3
+value-date-time = element date-time {
+    xsd:string { pattern = "(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?"
+                         ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+  }
+
+# 4.3.4
+value-date-and-or-time = value-date | value-date-time | value-time
+
+# 4.3.5
+value-timestamp = element timestamp {
+    xsd:string { pattern = "\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?" }
+  }
+
+# 4.4
+value-boolean = element boolean { xsd:boolean }
+
+# 4.5
+value-integer = element integer { xsd:integer }
+
+# 4.6
+value-float = element float { xsd:float }
+
+# 4.7
+value-utc-offset = element utc-offset {
+    xsd:string { pattern = "[+\-]\d\d(\d\d)?" }
+  }
+
+# 4.8
+value-language-tag = element language-tag {
+    xsd:string { pattern = "([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})"
+                         ~ "(-[a-z]{4})?(-([a-z]{2}|\d{3}))?"
+                         ~ "(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*"
+                         ~ "(-[0-9a-wyz](-[0-9a-z]{2,8})+)*"
+                         ~ "(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|"
+                         ~ "[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}" }
+  }
+
+### Section 5: Parameters
+#
+# 5.1
+param-language = element language { value-language-tag }?
+
+# 5.2
+param-pref = element pref {
+    element integer {
+      xsd:integer { minInclusive = "1" maxInclusive = "100" }
+    }
+  }?
+
+# 5.4
+param-altid = element altid { value-text }?
+
+# 5.5
+param-pid = element pid {
+    element text { xsd:string { pattern = "\d+(\.\d+)?" } }+
+  }?
+
+# 5.6
+param-type = element type { element text { "work" | "home" }+ }?
+
+# 5.7
+param-mediatype = element mediatype { value-text }?
+
+# 5.8
+param-calscale = element calscale { element text { "gregorian" } }?
+
+# 5.9
+param-sort-as = element sort-as { value-text+ }?
+
+# 5.10
+param-geo = element geo { value-uri }?
+
+# 5.11
+param-tz = element tz { value-text | value-uri }?
+
+### Section 6: Properties
+#
+# 6.1.3
+property-source = element source {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-mediatype },
+    value-uri
+  }
+
+# 6.1.4
+property-kind = element kind {
+    element text { "individual" | "group" | "org" | "location" |
+                   x-name | iana-token }*
+  }
+
+# 6.2.1
+property-fn = element fn {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.2.2
+property-n = element n {
+    element parameters { param-language, param-sort-as, param-altid }?,
+    element surname { text }+,
+    element given { text }+,
+    element additional { text }+,
+    element prefix { text }+,
+    element suffix { text }+
+  }
+
+# 6.2.3
+property-nickname = element nickname {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text-list
+  }
+
+# 6.2.4
+property-photo = element photo {
+    element parameters { param-altid, param-pid, param-pref, param-type,
+                         param-mediatype }?,
+    value-uri
+  }
+
+# 6.2.5
+property-bday = element bday {
+    element parameters { param-altid, param-calscale }?,
+    (value-date-and-or-time | value-text)
+  }
+
+# 6.2.6
+property-anniversary = element anniversary {
+    element parameters { param-altid, param-calscale }?,
+    (value-date-and-or-time | value-text)
+  }
+
+# 6.2.7
+property-gender = element gender {
+    element sex { "" | "M" | "F" | "O" | "N" | "U" },
+    element identity { text }?
+  }
+
+# 6.3.1
+param-label = element label { value-text }?
+property-adr = element adr {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-geo, param-tz,
+                         param-label }?,
+    element pobox { text }+,
+    element ext { text }+,
+    element street { text }+,
+    element locality { text }+,
+    element region { text }+,
+    element code { text }+,
+    element country { text }+
+  }
+
+# 6.4.1
+property-tel = element tel {
+    element parameters {
+      param-altid,
+      param-pid,
+      param-pref,
+      element type {
+        element text { "work" | "home" | "text" | "voice"
+                     | "fax" | "cell" | "video" | "pager"
+                     | "textphone" }+
+      }?,
+      param-mediatype
+    }?,
+    (value-text | value-uri)
+  }
+
+# 6.4.2
+property-email = element email {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type }?,
+    value-text
+  }
+
+# 6.4.3
+property-impp = element impp {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.4.4
+property-lang = element lang {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type }?,
+    value-language-tag
+  }
+
+# 6.5.1
+property-tz = element tz {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    (value-text | value-uri | value-utc-offset)
+  }
+
+# 6.5.2
+property-geo = element geo {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.6.1
+property-title = element title {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.6.2
+property-role = element role {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.6.3
+property-logo = element logo {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.6.4
+property-org = element org {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-sort-as }?,
+    value-text-list
+  }
+
+# 6.6.5
+property-member = element member {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-mediatype }?,
+    value-uri
+  }
+
+# 6.6.6
+property-related = element related {
+    element parameters {
+      param-altid,
+      param-pid,
+      param-pref,
+      element type {
+        element text {
+          "work" | "home" | "contact" | "acquaintance" |
+          "friend" | "met" | "co-worker" | "colleague" | "co-resident" |
+          "neighbor" | "child" | "parent" | "sibling" | "spouse" |
+          "kin" | "muse" | "crush" | "date" | "sweetheart" | "me" |
+          "agent" | "emergency"
+        }+
+      }?,
+      param-mediatype
+    }?,
+    (value-uri | value-text)
+  }
+
+# 6.7.1
+property-categories = element categories {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type }?,
+    value-text-list
+  }
+
+# 6.7.2
+property-note = element note {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type }?,
+    value-text
+  }
+
+# 6.7.3
+property-prodid = element prodid { value-text }
+
+# 6.7.4
+property-rev = element rev { value-timestamp }
+
+# 6.7.5
+property-sound = element sound {
+    element parameters { param-language, param-altid, param-pid,
+                         param-pref, param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.7.6
+property-uid = element uid { value-uri }
+
+# 6.7.7
+property-clientpidmap = element clientpidmap {
+    element sourceid { xsd:positiveInteger },
+    value-uri
+  }
+
+# 6.7.8
+property-url = element url {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.8.1
+property-key = element key {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    (value-uri | value-text)
+  }
+
+# 6.9.1
+property-fburl = element fburl {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.9.2
+property-caladruri = element caladruri {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# 6.9.3
+property-caluri = element caluri {
+    element parameters { param-altid, param-pid, param-pref,
+                         param-type, param-mediatype }?,
+    value-uri
+  }
+
+# Top-level grammar
+property = property-adr | property-anniversary | property-bday
+         | property-caladruri | property-caluri | property-categories
+         | property-clientpidmap | property-email | property-fburl
+         | property-fn | property-geo | property-impp | property-key
+         | property-kind | property-lang | property-logo
+         | property-member | property-n | property-nickname
+         | property-note | property-org | property-photo
+         | property-prodid | property-related | property-rev
+         | property-role | property-gender | property-sound
+         | property-source | property-tel | property-title
+         | property-tz | property-uid | property-url
+start = element vcards {
+    element vcard {
+      (property
+       | element group {
+           attribute name { text },
+           property*
+         })+
+    }+
+  }
+
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/xCard-4.0.xsd
new file mode 100644 (file)
index 0000000..bb1b175
--- /dev/null
@@ -0,0 +1,1041 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:ietf:params:xml:ns:vcard-4.0" xmlns:ns1="urn:ietf:params:xml:ns:vcard-4.0">
+  <!--
+    
+    3.3
+  -->
+  <!-- mbaudier - 2022-05-31 : corrected regexp from RFC 6351 -->
+  <xs:simpleType name="iana-token">
+    <xs:annotation>
+      <xs:documentation>Section 3.3: vCard Format Specification</xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:string">
+      <xs:pattern value="[a-zA-Z0-9]+"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <!-- mbaudier - 2022-05-31 : corrected regexp from RFC 6351 -->
+  <xs:simpleType name="x-name">
+    <xs:restriction base="xs:string">
+      <xs:pattern value="x-[a-zA-Z0-9]+"/>
+    </xs:restriction>
+  </xs:simpleType>
+  <!--
+    
+    4.1
+  -->
+  <xs:element name="text" type="xs:string"/>
+  <xs:group name="value-text-list">
+    <xs:sequence>
+      <xs:element maxOccurs="unbounded" ref="ns1:text"/>
+    </xs:sequence>
+  </xs:group>
+  <!-- 4.2 -->
+  <xs:element name="uri" type="xs:anyURI"/>
+  <!-- 4.3.1 -->
+  <xs:element name="date" substitutionGroup="ns1:value-date-and-or-time">
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:pattern value="\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <!-- 4.3.2 -->
+  <xs:element name="time" substitutionGroup="ns1:value-date-and-or-time">
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:pattern value="(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)(Z|[+\-]\d\d(\d\d)?)?"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <!-- 4.3.3 -->
+  <xs:element name="date-time" substitutionGroup="ns1:value-date-and-or-time">
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:pattern value="(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?(Z|[+\-]\d\d(\d\d)?)?"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <!-- 4.3.4 -->
+  <xs:element name="value-date-and-or-time" abstract="true"/>
+  <!-- 4.3.5 -->
+  <xs:complexType name="value-timestamp">
+    <xs:sequence>
+      <xs:element ref="ns1:timestamp"/>
+    </xs:sequence>
+  </xs:complexType>
+  <xs:element name="timestamp">
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:pattern value="\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <!-- 4.4 -->
+  <xs:element name="boolean" type="xs:boolean"/>
+  <!-- 4.5 -->
+  <xs:element name="integer" type="xs:integer"/>
+  <!-- 4.6 -->
+  <xs:element name="float" type="xs:float"/>
+  <!-- 4.7 -->
+  <xs:element name="utc-offset">
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:pattern value="[+\-]\d\d(\d\d)?"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <!-- 4.8 -->
+  <xs:element name="language-tag">
+    <xs:simpleType>
+      <xs:restriction base="xs:string">
+        <xs:pattern value="([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})(-[a-z]{4})?(-([a-z]{2}|\d{3}))?(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*(-[0-9a-wyz](-[0-9a-z]{2,8})+)*(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <!--
+    
+    5.1
+  -->
+  <xs:group name="param-language">
+    <xs:annotation>
+      <xs:documentation>Section 5: Parameters</xs:documentation>
+    </xs:annotation>
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:language"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="language">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:language-tag"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.2 -->
+  <xs:group name="param-pref">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:pref"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="pref">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="integer">
+          <xs:simpleType>
+            <xs:restriction base="xs:integer">
+              <xs:minInclusive value="1"/>
+              <xs:maxInclusive value="100"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.4 -->
+  <xs:group name="param-altid">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:altid"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="altid">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.5 -->
+  <xs:group name="param-pid">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:pid"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="pid">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:string">
+              <xs:pattern value="\d+(\.\d+)?"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.6 -->
+  <xs:group name="param-type">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:type"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="type">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="work"/>
+              <xs:enumeration value="home"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.7 -->
+  <xs:group name="param-mediatype">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:mediatype"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="mediatype">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.8 -->
+  <xs:group name="param-calscale">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:calscale"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="calscale">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="text">
+          <xs:simpleType>
+            <xs:restriction base="xs:token">
+              <xs:enumeration value="gregorian"/>
+            </xs:restriction>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.9 -->
+  <xs:group name="param-sort-as">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:sort-as"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="sort-as">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 5.10 -->
+  <xs:group name="param-geo">
+    <xs:sequence>
+      <xs:element minOccurs="0" name="geo">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element ref="ns1:uri"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 5.11 -->
+  <xs:group name="param-tz">
+    <xs:sequence>
+      <xs:element minOccurs="0" name="tz">
+        <xs:complexType>
+          <xs:choice>
+            <xs:element ref="ns1:text"/>
+            <xs:element ref="ns1:uri"/>
+          </xs:choice>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!--
+    
+    6.1.3
+  -->
+  <xs:element name="source">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.1.4 -->
+  <xs:element name="kind">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" maxOccurs="unbounded" name="text">
+          <xs:simpleType>
+            <xs:union memberTypes="ns1:x-name ns1:iana-token">
+              <xs:simpleType>
+                <xs:restriction base="xs:token">
+                  <xs:enumeration value="individual"/>
+                </xs:restriction>
+              </xs:simpleType>
+              <xs:simpleType>
+                <xs:restriction base="xs:token">
+                  <xs:enumeration value="group"/>
+                </xs:restriction>
+              </xs:simpleType>
+              <xs:simpleType>
+                <xs:restriction base="xs:token">
+                  <xs:enumeration value="org"/>
+                </xs:restriction>
+              </xs:simpleType>
+              <xs:simpleType>
+                <xs:restriction base="xs:token">
+                  <xs:enumeration value="location"/>
+                </xs:restriction>
+              </xs:simpleType>
+            </xs:union>
+          </xs:simpleType>
+        </xs:element>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.2.1 -->
+  <xs:element name="fn">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.2.2 -->
+  <xs:element name="n">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-sort-as"/>
+              <xs:group ref="ns1:param-altid"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element maxOccurs="unbounded" ref="ns1:surname"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:given"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:additional"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:prefix"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:suffix"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="surname" type="xs:string"/>
+  <xs:element name="given" type="xs:string"/>
+  <xs:element name="additional" type="xs:string"/>
+  <xs:element name="prefix" type="xs:string"/>
+  <xs:element name="suffix" type="xs:string"/>
+  <!-- 6.2.3 -->
+  <xs:element name="nickname">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text-list"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.2.4 -->
+  <xs:element name="photo">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.2.5 -->
+  <xs:element name="bday">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-calscale"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:value-date-and-or-time"/>
+          <xs:element ref="ns1:text"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.2.6 -->
+  <xs:element name="anniversary">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-calscale"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:value-date-and-or-time"/>
+          <xs:element ref="ns1:text"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.2.7 -->
+  <xs:element name="gender">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:sex"/>
+        <xs:element minOccurs="0" ref="ns1:identity"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sex">
+    <xs:simpleType>
+      <xs:restriction base="xs:token">
+        <xs:enumeration value=""/>
+        <xs:enumeration value="M"/>
+        <xs:enumeration value="F"/>
+        <xs:enumeration value="O"/>
+        <xs:enumeration value="N"/>
+        <xs:enumeration value="U"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:element>
+  <xs:element name="identity" type="xs:string"/>
+  <!-- 6.3.1 -->
+  <xs:group name="param-label">
+    <xs:sequence>
+      <xs:element minOccurs="0" ref="ns1:label"/>
+    </xs:sequence>
+  </xs:group>
+  <xs:element name="label">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="adr">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-geo"/>
+              <xs:group ref="ns1:param-tz"/>
+              <xs:group ref="ns1:param-label"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element maxOccurs="unbounded" ref="ns1:pobox"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:ext"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:street"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:locality"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:region"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:code"/>
+        <xs:element maxOccurs="unbounded" ref="ns1:country"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="pobox" type="xs:string"/>
+  <xs:element name="ext" type="xs:string"/>
+  <xs:element name="street" type="xs:string"/>
+  <xs:element name="locality" type="xs:string"/>
+  <xs:element name="region" type="xs:string"/>
+  <xs:element name="code" type="xs:string"/>
+  <xs:element name="country" type="xs:string"/>
+  <!-- 6.4.1 -->
+  <xs:element name="tel">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:element minOccurs="0" name="type">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element maxOccurs="unbounded" name="text">
+                      <xs:simpleType>
+                        <xs:restriction base="xs:token">
+                          <xs:enumeration value="work"/>
+                          <xs:enumeration value="home"/>
+                          <xs:enumeration value="text"/>
+                          <xs:enumeration value="voice"/>
+                          <xs:enumeration value="fax"/>
+                          <xs:enumeration value="cell"/>
+                          <xs:enumeration value="video"/>
+                          <xs:enumeration value="pager"/>
+                          <xs:enumeration value="textphone"/>
+                        </xs:restriction>
+                      </xs:simpleType>
+                    </xs:element>
+                  </xs:sequence>
+                </xs:complexType>
+              </xs:element>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:text"/>
+          <xs:element ref="ns1:uri"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.4.2 -->
+  <xs:element name="email">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.4.3 -->
+  <xs:element name="impp">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.4.4 -->
+  <xs:element name="lang">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:language-tag"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.5.1 -->
+  <xs:group name="property-tz">
+    <xs:sequence>
+      <xs:element name="tz">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" name="parameters">
+              <xs:complexType>
+                <xs:sequence>
+                  <xs:group ref="ns1:param-altid"/>
+                  <xs:group ref="ns1:param-pid"/>
+                  <xs:group ref="ns1:param-pref"/>
+                  <xs:group ref="ns1:param-type"/>
+                  <xs:group ref="ns1:param-mediatype"/>
+                </xs:sequence>
+              </xs:complexType>
+            </xs:element>
+            <xs:choice>
+              <xs:element ref="ns1:text"/>
+              <xs:element ref="ns1:uri"/>
+              <xs:element ref="ns1:utc-offset"/>
+            </xs:choice>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 6.5.2 -->
+  <xs:group name="property-geo">
+    <xs:sequence>
+      <xs:element name="geo">
+        <xs:complexType>
+          <xs:sequence>
+            <xs:element minOccurs="0" name="parameters">
+              <xs:complexType>
+                <xs:sequence>
+                  <xs:group ref="ns1:param-altid"/>
+                  <xs:group ref="ns1:param-pid"/>
+                  <xs:group ref="ns1:param-pref"/>
+                  <xs:group ref="ns1:param-type"/>
+                  <xs:group ref="ns1:param-mediatype"/>
+                </xs:sequence>
+              </xs:complexType>
+            </xs:element>
+            <xs:element ref="ns1:uri"/>
+          </xs:sequence>
+        </xs:complexType>
+      </xs:element>
+    </xs:sequence>
+  </xs:group>
+  <!-- 6.6.1 -->
+  <xs:element name="title">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.6.2 -->
+  <xs:element name="role">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.6.3 -->
+  <xs:element name="logo">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.6.4 -->
+  <xs:element name="org">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-sort-as"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text-list"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.6.5 -->
+  <xs:element name="member">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.6.6 -->
+  <xs:element name="related">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:element minOccurs="0" name="type">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element maxOccurs="unbounded" name="text">
+                      <xs:simpleType>
+                        <xs:restriction base="xs:token">
+                          <xs:enumeration value="work"/>
+                          <xs:enumeration value="home"/>
+                          <xs:enumeration value="contact"/>
+                          <xs:enumeration value="acquaintance"/>
+                          <xs:enumeration value="friend"/>
+                          <xs:enumeration value="met"/>
+                          <xs:enumeration value="co-worker"/>
+                          <xs:enumeration value="colleague"/>
+                          <xs:enumeration value="co-resident"/>
+                          <xs:enumeration value="neighbor"/>
+                          <xs:enumeration value="child"/>
+                          <xs:enumeration value="parent"/>
+                          <xs:enumeration value="sibling"/>
+                          <xs:enumeration value="spouse"/>
+                          <xs:enumeration value="kin"/>
+                          <xs:enumeration value="muse"/>
+                          <xs:enumeration value="crush"/>
+                          <xs:enumeration value="date"/>
+                          <xs:enumeration value="sweetheart"/>
+                          <xs:enumeration value="me"/>
+                          <xs:enumeration value="agent"/>
+                          <xs:enumeration value="emergency"/>
+                        </xs:restriction>
+                      </xs:simpleType>
+                    </xs:element>
+                  </xs:sequence>
+                </xs:complexType>
+              </xs:element>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:uri"/>
+          <xs:element ref="ns1:text"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.7.1 -->
+  <xs:element name="categories">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:group ref="ns1:value-text-list"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.7.2 -->
+  <xs:element name="note">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.7.3 -->
+  <xs:element name="prodid">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:text"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.7.4 -->
+  <xs:element name="rev" type="ns1:value-timestamp"/>
+  <!-- 6.7.5 -->
+  <xs:element name="sound">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-language"/>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.7.6 -->
+  <xs:element name="uid">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.7.7 -->
+  <xs:element name="clientpidmap">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="ns1:sourceid"/>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="sourceid" type="xs:positiveInteger"/>
+  <!-- 6.7.8 -->
+  <xs:element name="url">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.8.1 -->
+  <xs:element name="key">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:choice>
+          <xs:element ref="ns1:uri"/>
+          <xs:element ref="ns1:text"/>
+        </xs:choice>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.9.1 -->
+  <xs:element name="fburl">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.9.2 -->
+  <xs:element name="caladruri">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- 6.9.3 -->
+  <xs:element name="caluri">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element minOccurs="0" name="parameters">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:group ref="ns1:param-altid"/>
+              <xs:group ref="ns1:param-pid"/>
+              <xs:group ref="ns1:param-pref"/>
+              <xs:group ref="ns1:param-type"/>
+              <xs:group ref="ns1:param-mediatype"/>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element ref="ns1:uri"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <!-- Top-level grammar -->
+  <xs:group name="property">
+    <xs:choice>
+      <xs:element ref="ns1:adr"/>
+      <xs:element ref="ns1:anniversary"/>
+      <xs:element ref="ns1:bday"/>
+      <xs:element ref="ns1:caladruri"/>
+      <xs:element ref="ns1:caluri"/>
+      <xs:element ref="ns1:categories"/>
+      <xs:element ref="ns1:clientpidmap"/>
+      <xs:element ref="ns1:email"/>
+      <xs:element ref="ns1:fburl"/>
+      <xs:element ref="ns1:fn"/>
+      <xs:group ref="ns1:property-geo"/>
+      <xs:element ref="ns1:impp"/>
+      <xs:element ref="ns1:key"/>
+      <xs:element ref="ns1:kind"/>
+      <xs:element ref="ns1:lang"/>
+      <xs:element ref="ns1:logo"/>
+      <xs:element ref="ns1:member"/>
+      <xs:element ref="ns1:n"/>
+      <xs:element ref="ns1:nickname"/>
+      <xs:element ref="ns1:note"/>
+      <xs:element ref="ns1:org"/>
+      <xs:element ref="ns1:photo"/>
+      <xs:element ref="ns1:prodid"/>
+      <xs:element ref="ns1:related"/>
+      <xs:element ref="ns1:rev"/>
+      <xs:element ref="ns1:role"/>
+      <xs:element ref="ns1:gender"/>
+      <xs:element ref="ns1:sound"/>
+      <xs:element ref="ns1:source"/>
+      <xs:element ref="ns1:tel"/>
+      <xs:element ref="ns1:title"/>
+      <xs:group ref="ns1:property-tz"/>
+      <xs:element ref="ns1:uid"/>
+      <xs:element ref="ns1:url"/>
+    </xs:choice>
+  </xs:group>
+  <xs:element name="vcards">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="ns1:vcard"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="vcard">
+    <xs:complexType>
+      <xs:choice maxOccurs="unbounded">
+        <xs:group ref="ns1:property"/>
+        <xs:element ref="ns1:group"/>
+      </xs:choice>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="group">
+    <xs:complexType>
+      <xs:group minOccurs="0" maxOccurs="unbounded" ref="ns1:property"/>
+      <xs:attribute name="name" use="required"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xlink.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/xlink.xsd
new file mode 100644 (file)
index 0000000..e9ce635
--- /dev/null
@@ -0,0 +1,293 @@
+<?xml version='1.0' encoding='UTF-8'?>\r
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink">\r
\r
+ <xs:annotation>\r
+  <xs:documentation>This schema is not normative, or even definitive.  The\r
+prose copy in the XLink 1.1 recommendation (http://www.w3.org/TR/xlink11/) is\r
+definitive, although it should not differ from this file, except for the\r
+absence of these two initial comments.</xs:documentation>\r
+ </xs:annotation>\r
\r
+ <xs:annotation>\r
+  <xs:documentation>In keeping with the W3C's standard versioning\r
+   policy, this schema document will persist at\r
+   http://www.w3.org/XML/2008/06/xlink.xsd.\r
+   At the date of issue it can also be found at\r
+   http://www.w3.org/1999/xlink.xsd.\r
+   The schema document at that URI may however change in the future,\r
+   in order to remain compatible with the latest version of XML Schema\r
+   itself, or with the XLink namespace itself.  In other words, if the XML\r
+   Schema or XLink namespaces change, the version of this document at\r
+   http://www.w3.org/1999/xlink.xsd will change\r
+   accordingly; the version at\r
+   http://www.w3.org/2008/06/xlink.xsd will not change.\r
+</xs:documentation>\r
+ </xs:annotation>\r
\r
+ <xs:annotation>\r
+  <xs:documentation>This schema document provides attribute declarations and\r
+attribute group, complex type and simple type definitions which can be used in\r
+the construction of user schemas to define the structure of particular linking\r
+constructs, e.g.\r
+<![CDATA[\r
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\r
+           xmlns:xl="http://www.w3.org/1999/xlink">\r
+\r
+ <xs:import namespace="http://www.w3.org/1999/xlink"\r
+            location="http://www.w3.org/1999/xlink.xsd">\r
+\r
+ <xs:element name="mySimple">\r
+  <xs:complexType>\r
+   ...\r
+   <xs:attributeGroup ref="xl:simpleAttrs"/>\r
+   ...\r
+  </xs:complexType>\r
+ </xs:element>\r
+ ...\r
+</xs:schema>]]></xs:documentation>\r
+ </xs:annotation>\r
+\r
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>\r
+\r
+ <xs:attribute name="type" type="xlink:typeType"/>\r
+\r
+ <xs:simpleType name="typeType">\r
+  <xs:restriction base="xs:token">\r
+   <xs:enumeration value="simple"/>\r
+   <xs:enumeration value="extended"/>\r
+   <xs:enumeration value="title"/>\r
+   <xs:enumeration value="resource"/>\r
+   <xs:enumeration value="locator"/>\r
+   <xs:enumeration value="arc"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="href" type="xlink:hrefType"/>\r
+\r
+ <xs:simpleType name="hrefType">\r
+  <xs:restriction base="xs:anyURI"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="role" type="xlink:roleType"/>\r
+\r
+ <xs:simpleType name="roleType">\r
+  <xs:restriction base="xs:anyURI">\r
+   <xs:minLength value="1"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="arcrole" type="xlink:arcroleType"/>\r
+\r
+ <xs:simpleType name="arcroleType">\r
+  <xs:restriction base="xs:anyURI">\r
+   <xs:minLength value="1"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="title" type="xlink:titleAttrType"/>\r
+\r
+ <xs:simpleType name="titleAttrType">\r
+  <xs:restriction base="xs:string"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="show" type="xlink:showType"/>\r
+\r
+ <xs:simpleType name="showType">\r
+  <xs:restriction base="xs:token">\r
+   <xs:enumeration value="new"/>\r
+   <xs:enumeration value="replace"/>\r
+   <xs:enumeration value="embed"/>\r
+   <xs:enumeration value="other"/>\r
+   <xs:enumeration value="none"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="actuate" type="xlink:actuateType"/>\r
+\r
+ <xs:simpleType name="actuateType">\r
+  <xs:restriction base="xs:token">\r
+   <xs:enumeration value="onLoad"/>\r
+   <xs:enumeration value="onRequest"/>\r
+   <xs:enumeration value="other"/>\r
+   <xs:enumeration value="none"/>\r
+  </xs:restriction>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="label" type="xlink:labelType"/>\r
+\r
+ <xs:simpleType name="labelType">\r
+  <xs:restriction base="xs:NCName"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="from" type="xlink:fromType"/>\r
+\r
+ <xs:simpleType name="fromType">\r
+  <xs:restriction base="xs:NCName"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attribute name="to" type="xlink:toType"/>\r
+\r
+ <xs:simpleType name="toType">\r
+  <xs:restriction base="xs:NCName"/>\r
+ </xs:simpleType>\r
+\r
+ <xs:attributeGroup name="simpleAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="simple"/>\r
+  <xs:attribute ref="xlink:href"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:arcrole"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:show"/>\r
+  <xs:attribute ref="xlink:actuate"/>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="simpleModel">\r
+  <xs:sequence>\r
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType mixed="true" name="simple">\r
+  <xs:annotation>\r
+   <xs:documentation>\r
+    Intended for use as the type of user-declared elements to make them\r
+    simple links.\r
+   </xs:documentation>\r
+  </xs:annotation>\r
+  <xs:group ref="xlink:simpleModel"/>\r
+  <xs:attributeGroup ref="xlink:simpleAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:attributeGroup name="extendedAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="extended" use="required"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="extendedModel">\r
+   <xs:choice>\r
+    <xs:element ref="xlink:title"/>\r
+    <xs:element ref="xlink:resource"/>\r
+    <xs:element ref="xlink:locator"/>\r
+    <xs:element ref="xlink:arc"/>\r
+  </xs:choice>\r
+ </xs:group>\r
+\r
+ <xs:complexType name="extended">\r
+  <xs:annotation>\r
+   <xs:documentation>\r
+    Intended for use as the type of user-declared elements to make them\r
+    extended links.\r
+    Note that the elements referenced in the content model are all abstract.\r
+    The intention is that by simply declaring elements with these as their\r
+    substitutionGroup, all the right things will happen.\r
+   </xs:documentation>\r
+  </xs:annotation>\r
+  <xs:group ref="xlink:extendedModel" minOccurs="0" maxOccurs="unbounded"/>\r
+  <xs:attributeGroup ref="xlink:extendedAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="title" type="xlink:titleEltType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="titleAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="title" use="required"/>\r
+  <xs:attribute ref="xml:lang">\r
+   <xs:annotation>\r
+    <xs:documentation>\r
+     xml:lang is not required, but provides much of the\r
+     motivation for title elements in addition to attributes, and so\r
+     is provided here for convenience.\r
+    </xs:documentation>\r
+   </xs:annotation>\r
+  </xs:attribute>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="titleModel">\r
+  <xs:sequence>\r
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType mixed="true" name="titleEltType">\r
+  <xs:group ref="xlink:titleModel"/>\r
+  <xs:attributeGroup ref="xlink:titleAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="resource" type="xlink:resourceType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="resourceAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="resource" use="required"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:label"/>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="resourceModel">\r
+  <xs:sequence>\r
+   <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType mixed="true" name="resourceType">\r
+  <xs:group ref="xlink:resourceModel"/>\r
+  <xs:attributeGroup ref="xlink:resourceAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="locator" type="xlink:locatorType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="locatorAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="locator" use="required"/>\r
+  <xs:attribute ref="xlink:href" use="required"/>\r
+  <xs:attribute ref="xlink:role"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:label">\r
+   <xs:annotation>\r
+    <xs:documentation>\r
+     label is not required, but locators have no particular\r
+     XLink function if they are not labeled.\r
+    </xs:documentation>\r
+   </xs:annotation>\r
+  </xs:attribute>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="locatorModel">\r
+  <xs:sequence>\r
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType name="locatorType">\r
+  <xs:group ref="xlink:locatorModel"/>\r
+  <xs:attributeGroup ref="xlink:locatorAttrs"/>\r
+ </xs:complexType>\r
+\r
+ <xs:element name="arc" type="xlink:arcType" abstract="true"/>\r
+\r
+ <xs:attributeGroup name="arcAttrs">\r
+  <xs:attribute ref="xlink:type" fixed="arc" use="required"/>\r
+  <xs:attribute ref="xlink:arcrole"/>\r
+  <xs:attribute ref="xlink:title"/>\r
+  <xs:attribute ref="xlink:show"/>\r
+  <xs:attribute ref="xlink:actuate"/>\r
+  <xs:attribute ref="xlink:from"/>\r
+  <xs:attribute ref="xlink:to">\r
+   <xs:annotation>\r
+    <xs:documentation>\r
+     from and to have default behavior when values are missing\r
+    </xs:documentation>\r
+   </xs:annotation>\r
+  </xs:attribute>\r
+ </xs:attributeGroup>\r
+\r
+ <xs:group name="arcModel">\r
+  <xs:sequence>\r
+   <xs:element ref="xlink:title" minOccurs="0" maxOccurs="unbounded"/>\r
+  </xs:sequence>\r
+ </xs:group>\r
+\r
+ <xs:complexType name="arcType">\r
+  <xs:group ref="xlink:arcModel"/>\r
+  <xs:attributeGroup ref="xlink:arcAttrs"/>\r
+ </xs:complexType>\r
+\r
+</xs:schema>\r
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xml-events-attribs-1.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/xml-events-attribs-1.xsd
new file mode 100644 (file)
index 0000000..ef99128
--- /dev/null
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+    targetNamespace="http://www.w3.org/2001/xml-events" 
+    xmlns:ev="http://www.w3.org/2001/xml-events" 
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://www.w3.org/2001/XMLSchema 
+                        http://www.w3.org/2001/XMLSchema.xsd" 
+    elementFormDefault="unqualified" 
+    blockDefault="#all" 
+    finalDefault="#all" 
+    attributeFormDefault="unqualified">
+
+  <xs:annotation>
+    <xs:documentation>
+      This is the XML Schema for XML Events global attributes
+
+      URI: http://www.w3.org/MarkUp/SCHEMA/xml-events-attribs-1.xsd
+      $Id: xml-events-attribs-1.xsd,v 1.7 2004/11/22 17:09:15 ahby Exp $
+    </xs:documentation>
+    <xs:documentation source="xml-events-copyright-1.xsd"/>
+  </xs:annotation>
+
+  <xs:annotation>
+    <xs:documentation>
+      XML Event Attributes
+               
+        These "global" event attributes are defined in "Attaching
+        Attributes Directly to the Observer Element" of the XML
+        Events specification.
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:attribute name="event" type="xs:NMTOKEN"/>
+  <xs:attribute name="observer" type="xs:IDREF"/>
+  <xs:attribute name="target" type="xs:IDREF"/>
+  <xs:attribute name="handler" type="xs:anyURI"/>
+  <xs:attribute name="phase" default="default">
+    <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+        <xs:enumeration value="capture"/>
+        <xs:enumeration value="default"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:attribute>
+  <xs:attribute name="propagate" default="continue">
+    <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+        <xs:enumeration value="stop"/>
+        <xs:enumeration value="continue"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:attribute>
+  <xs:attribute name="defaultAction" default="perform">
+    <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+        <xs:enumeration value="cancel"/>
+        <xs:enumeration value="perform"/>
+      </xs:restriction>
+    </xs:simpleType>
+  </xs:attribute>
+
+  <xs:attributeGroup name="XmlEvents.attlist">
+    <xs:attribute ref="ev:event"/>
+    <xs:attribute ref="ev:observer"/>
+    <xs:attribute ref="ev:target"/>
+    <xs:attribute ref="ev:handler"/>
+    <xs:attribute ref="ev:phase"/>
+    <xs:attribute ref="ev:propagate"/>
+    <xs:attribute ref="ev:defaultAction"/>
+  </xs:attributeGroup>
+
+</xs:schema>
diff --git a/org.argeo.app.core/src/org/argeo/app/core/schemas/xml.xsd b/org.argeo.app.core/src/org/argeo/app/core/schemas/xml.xsd
new file mode 100644 (file)
index 0000000..aea7d0d
--- /dev/null
@@ -0,0 +1,287 @@
+<?xml version='1.0'?>
+<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" 
+  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+  xmlns   ="http://www.w3.org/1999/xhtml"
+  xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+    <h1>About the XML namespace</h1>
+
+    <div class="bodytext">
+     <p>
+      This schema document describes the XML namespace, in a form
+      suitable for import by other schema documents.
+     </p>
+     <p>
+      See <a href="http://www.w3.org/XML/1998/namespace.html">
+      http://www.w3.org/XML/1998/namespace.html</a> and
+      <a href="http://www.w3.org/TR/REC-xml">
+      http://www.w3.org/TR/REC-xml</a> for information 
+      about this namespace.
+     </p>
+     <p>
+      Note that local names in this namespace are intended to be
+      defined only by the World Wide Web Consortium or its subgroups.
+      The names currently defined in this namespace are listed below.
+      They should not be used with conflicting semantics by any Working
+      Group, specification, or document instance.
+     </p>
+     <p>   
+      See further below in this document for more information about <a
+      href="#usage">how to refer to this schema document from your own
+      XSD schema documents</a> and about <a href="#nsversioning">the
+      namespace-versioning policy governing this schema document</a>.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>lang (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       is a language code for the natural language of the content of
+       any element; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML specification.</p>
+     
+    </div>
+    <div>
+     <h4>Notes</h4>
+     <p>
+      Attempting to install the relevant ISO 2- and 3-letter
+      codes as the enumerated possible values is probably never
+      going to be a realistic possibility.  
+     </p>
+     <p>
+      See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
+       http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
+      and the IANA language subtag registry at
+      <a href="http://www.iana.org/assignments/language-subtag-registry">
+       http://www.iana.org/assignments/language-subtag-registry</a>
+      for further information.
+     </p>
+     <p>
+      The union allows for the 'un-declaration' of xml:lang with
+      the empty string.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>    
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>space (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose
+       value is a keyword indicating what whitespace processing
+       discipline is intended for the content of the element; its
+       value is inherited.  This name is reserved by virtue of its
+       definition in the XML specification.</p>
+     
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>base (as an attribute name)</h3>
+      <p>
+       denotes an attribute whose value
+       provides a URI to be used as the base for interpreting any
+       relative URIs in the scope of the element on which it
+       appears; its value is inherited.  This name is reserved
+       by virtue of its definition in the XML Base specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>
+    <div>
+     
+      <h3>id (as an attribute name)</h3> 
+      <p>
+       denotes an attribute whose value
+       should be interpreted as if declared to be of type ID.
+       This name is reserved by virtue of its definition in the
+       xml:id specification.</p>
+     
+     <p>
+      See <a
+      href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
+      for information about this attribute.
+     </p>
+    </div>
+   </xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+  <xs:attribute ref="xml:id"/>
+ </xs:attributeGroup>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div>
+   
+    <h3>Father (in any context at all)</h3> 
+
+    <div class="bodytext">
+     <p>
+      denotes Jon Bosak, the chair of 
+      the original XML Working Group.  This name is reserved by 
+      the following decision of the W3C XML Plenary and 
+      XML Coordination groups:
+     </p>
+     <blockquote>
+       <p>
+       In appreciation for his vision, leadership and
+       dedication the W3C XML Plenary on this 10th day of
+       February, 2000, reserves for Jon Bosak in perpetuity
+       the XML name "xml:Father".
+       </p>
+     </blockquote>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div xml:id="usage" id="usage">
+    <h2><a name="usage">About this schema document</a></h2>
+
+    <div class="bodytext">
+     <p>
+      This schema defines attributes and an attribute group suitable
+      for use by schemas wishing to allow <code>xml:base</code>,
+      <code>xml:lang</code>, <code>xml:space</code> or
+      <code>xml:id</code> attributes on elements they define.
+     </p>
+     <p>
+      To enable this, such a schema must import this schema for
+      the XML namespace, e.g. as follows:
+     </p>
+     <pre>
+          &lt;schema . . .>
+           . . .
+           &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+     </pre>
+     <p>
+      or
+     </p>
+     <pre>
+           &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                      schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
+     </pre>
+     <p>
+      Subsequently, qualified reference to any of the attributes or the
+      group defined below will have the desired effect, e.g.
+     </p>
+     <pre>
+          &lt;type . . .>
+           . . .
+           &lt;attributeGroup ref="xml:specialAttrs"/>
+     </pre>
+     <p>
+      will define a type which will schema-validate an instance element
+      with any of those attributes.
+     </p>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>
+   <div id="nsversioning" xml:id="nsversioning">
+    <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
+    <div class="bodytext">
+     <p>
+      In keeping with the XML Schema WG's standard versioning
+      policy, this schema document will persist at
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd</a>.
+     </p>
+     <p>
+      At the date of issue it can also be found at
+      <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd</a>.
+     </p>
+     <p>
+      The schema document at that URI may however change in the future,
+      in order to remain compatible with the latest version of XML
+      Schema itself, or with the XML namespace itself.  In other words,
+      if the XML Schema or XML namespaces change, the version of this
+      document at <a href="http://www.w3.org/2001/xml.xsd">
+       http://www.w3.org/2001/xml.xsd 
+      </a> 
+      will change accordingly; the version at 
+      <a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd 
+      </a> 
+      will not change.
+     </p>
+     <p>
+      Previous dated (and unchanging) versions of this schema 
+      document are at:
+     </p>
+     <ul>
+      <li><a href="http://www.w3.org/2009/01/xml.xsd">
+       http://www.w3.org/2009/01/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2007/08/xml.xsd">
+       http://www.w3.org/2007/08/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2004/10/xml.xsd">
+       http://www.w3.org/2004/10/xml.xsd</a></li>
+      <li><a href="http://www.w3.org/2001/03/xml.xsd">
+       http://www.w3.org/2001/03/xml.xsd</a></li>
+     </ul>
+    </div>
+   </div>
+  </xs:documentation>
+ </xs:annotation>
+
+</xs:schema>
+
diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkAcrUtils.java b/org.argeo.app.core/src/org/argeo/app/docbook/DbkAcrUtils.java
new file mode 100644 (file)
index 0000000..fed027d
--- /dev/null
@@ -0,0 +1,40 @@
+package org.argeo.app.docbook;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.EntityType;
+
+/** Utilities when using ACR to access DocBook. */
+public class DbkAcrUtils {
+       /** Whether this DocBook element is of this type. */
+       public static boolean isDbk(Content content, DbkType type) {
+               return content.isContentClass(type.qName());
+       }
+
+       public static String getMediaFileref(Content node) {
+               Content mediadata;
+               if (node.hasChild(DbkType.imageobject)) {
+                       mediadata = node.child(DbkType.imageobject).child(DbkType.imagedata);
+               } else {
+                       mediadata = node.child(DbkType.videoobject).child(DbkType.videodata);
+               }
+
+               if (mediadata.containsKey(DbkAttr.fileref)) {
+                       return mediadata.attr(DbkAttr.fileref);
+               } else {
+                       return null;
+               }
+       }
+
+       public static Content getMetadata(Content infoContainer) {
+               if (!infoContainer.hasChild(DbkType.info))
+                       return null;
+               Content info = infoContainer.child(DbkType.info);
+               if (!info.hasChild(EntityType.local))
+                       return null;
+               return info.child(EntityType.local);
+       }
+
+       /** singleton */
+       private DbkAcrUtils() {
+       }
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkAttr.java b/org.argeo.app.core/src/org/argeo/app/docbook/DbkAttr.java
new file mode 100644 (file)
index 0000000..df10c8b
--- /dev/null
@@ -0,0 +1,15 @@
+package org.argeo.app.docbook;
+
+import org.argeo.api.acr.QNamed;
+
+/** Supported DocBook attributes. */
+public enum DbkAttr implements QNamed.Unqualified {
+       role,
+       //
+       fileref, contentwidth, contentdepth
+       //
+       ;
+
+       public final static String XLINK_HREF = "xlink:href";
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkMsg.java b/org.argeo.app.core/src/org/argeo/app/docbook/DbkMsg.java
new file mode 100644 (file)
index 0000000..2f34988
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.app.docbook;
+
+import org.argeo.cms.Localized;
+
+/** DocBook related messages. */
+public enum DbkMsg implements Localized {
+       paragraph, deleteParagraph,
+       //
+       section, deleteSection,
+       //
+       media, deleteMedia, insertPicture, insertVideo, insertParagraph,
+       //
+       ;
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/docbook/DbkType.java b/org.argeo.app.core/src/org/argeo/app/docbook/DbkType.java
new file mode 100644 (file)
index 0000000..ff83002
--- /dev/null
@@ -0,0 +1,41 @@
+package org.argeo.app.docbook;
+
+import org.argeo.api.acr.QNamed;
+
+/** Supported DocBook elements */
+public enum DbkType implements QNamed {
+       book, article, section,
+       //
+       info, title, para,
+       //
+       mediaobject, imageobject, imagedata, videoobject, videodata, caption,
+       //
+       link,
+       //
+       ;
+
+//     @Override
+//     public String getPrefix() {
+//             return prefix();
+//     }
+
+       @Deprecated
+       public static String prefix() {
+               return "dbk";
+       }
+
+       @Override
+       public String getNamespace() {
+               return namespace();
+       }
+
+       public static String namespace() {
+               return "http://docbook.org/ns/docbook";
+       }
+
+       @Override
+       public String getDefaultPrefix() {
+               return "dbk";
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/image/ImageProcessor.java b/org.argeo.app.core/src/org/argeo/app/image/ImageProcessor.java
new file mode 100644 (file)
index 0000000..eab49df
--- /dev/null
@@ -0,0 +1,330 @@
+package org.argeo.app.image;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import javax.imageio.ImageIO;
+
+import org.apache.commons.imaging.ImageReadException;
+import org.apache.commons.imaging.Imaging;
+import org.apache.commons.imaging.common.ImageMetadata;
+import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem;
+import org.apache.commons.imaging.common.RationalNumber;
+import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
+import org.apache.commons.imaging.formats.jpeg.exif.ExifRewriter;
+import org.apache.commons.imaging.formats.tiff.TiffField;
+import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
+import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
+import org.apache.commons.imaging.formats.tiff.constants.GpsTagConstants;
+import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;
+import org.apache.commons.imaging.formats.tiff.taginfos.TagInfo;
+import org.apache.commons.imaging.formats.tiff.write.TiffOutputDirectory;
+import org.apache.commons.imaging.formats.tiff.write.TiffOutputSet;
+
+public class ImageProcessor {
+       private Callable<InputStream> inSupplier;
+       private Callable<OutputStream> outSupplier;
+
+       public ImageProcessor(Callable<InputStream> inSupplier, Callable<OutputStream> outSupplier) {
+               super();
+               this.inSupplier = inSupplier;
+               this.outSupplier = outSupplier;
+       }
+
+       public void process() {
+               try {
+                       ImageMetadata metadata = null;
+                       Integer orientation = null;
+                       try (InputStream in = inSupplier.call()) {
+                               metadata = Imaging.getMetadata(in, null);
+                               orientation = getOrientation(metadata);
+                       }
+                       try (InputStream in = inSupplier.call()) {
+                               if (orientation != null && orientation != TiffTagConstants.ORIENTATION_VALUE_HORIZONTAL_NORMAL) {
+                                       BufferedImage sourceImage = ImageIO.read(in);
+                                       AffineTransform transform = getExifTransformation(orientation, sourceImage.getWidth(),
+                                                       sourceImage.getHeight());
+                                       BufferedImage targetImage = transformImage(sourceImage, orientation, transform);
+                                       Path temp = Files.createTempFile("image", ".jpg");
+                                       try {
+                                               try (OutputStream out = Files.newOutputStream(temp)) {
+                                                       ImageIO.write(targetImage, "jpeg", out);
+                                               }
+                                               copyWithMetadata(() -> Files.newInputStream(temp), metadata);
+                                       } finally {
+                                               Files.deleteIfExists(temp);
+                                       }
+                               } else {
+//                                     try (OutputStream out = outSupplier.call()) {
+                                       copyWithMetadata(() -> in, metadata);
+//                                     }
+                               }
+                       }
+               } catch (Exception e) {
+                       throw new RuntimeException("Cannot process image", e);
+               }
+       }
+
+       protected void copyWithMetadata(Callable<InputStream> inSupplier, ImageMetadata metadata) {
+               try (InputStream in = inSupplier.call(); OutputStream out = outSupplier.call();) {
+                       TiffOutputSet outputSet = null;
+                       if (metadata != null && metadata instanceof JpegImageMetadata) {
+                               final TiffImageMetadata exif = ((JpegImageMetadata) metadata).getExif();
+
+                               if (null != exif) {
+                                       outputSet = exif.getOutputSet();
+//                                     outputSet.getInteroperabilityDirectory().removeField(TiffTagConstants.TIFF_TAG_ORIENTATION);
+
+                                       for (TiffOutputDirectory dir : outputSet.getDirectories()) {
+//                                             TiffOutputField field = dir.findField(TiffTagConstants.TIFF_TAG_ORIENTATION);
+//                                             if (field != null) {
+                                               dir.removeField(TiffTagConstants.TIFF_TAG_ORIENTATION);
+                                               dir.removeField(TiffTagConstants.TIFF_TAG_IMAGE_WIDTH);
+                                               dir.removeField(TiffTagConstants.TIFF_TAG_IMAGE_LENGTH);
+                                               dir.removeField(ExifTagConstants.EXIF_TAG_EXIF_IMAGE_WIDTH);
+                                               dir.removeField(ExifTagConstants.EXIF_TAG_EXIF_IMAGE_LENGTH);
+//                                                     System.out.println("Removed orientation from " + dir.description());
+//                                             }
+                                       }
+                               }
+                       }
+
+                       if (null == outputSet) {
+                               outputSet = new TiffOutputSet();
+                       }
+                       new ExifRewriter().updateExifMetadataLossless(in, out, outputSet);
+               } catch (Exception e) {
+                       throw new RuntimeException("Could not update EXIF metadata", e);
+               }
+
+       }
+
+       public static BufferedImage transformImage(BufferedImage image, Integer orientation, AffineTransform transform)
+                       throws Exception {
+
+               AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BICUBIC);
+
+               int width = image.getWidth();
+               int height = image.getHeight();
+               switch (orientation) {
+               case TiffTagConstants.ORIENTATION_VALUE_ROTATE_180:
+               case TiffTagConstants.ORIENTATION_VALUE_MIRROR_HORIZONTAL_AND_ROTATE_270_CW:
+               case TiffTagConstants.ORIENTATION_VALUE_ROTATE_90_CW:
+               case TiffTagConstants.ORIENTATION_VALUE_MIRROR_HORIZONTAL_AND_ROTATE_90_CW:
+               case TiffTagConstants.ORIENTATION_VALUE_ROTATE_270_CW:
+                       width = image.getHeight();
+                       height = image.getWidth();
+                       break;
+               }
+
+               BufferedImage destinationImage = new BufferedImage(width, height, image.getType());
+
+               Graphics2D g = destinationImage.createGraphics();
+               g.setBackground(Color.WHITE);
+               g.clearRect(0, 0, destinationImage.getWidth(), destinationImage.getHeight());
+               destinationImage = op.filter(image, destinationImage);
+               return destinationImage;
+       }
+
+       public static int getOrientation(ImageMetadata metadata) {
+               if (metadata instanceof JpegImageMetadata) {
+                       JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
+                       TiffField field = jpegMetadata.findEXIFValue(TiffTagConstants.TIFF_TAG_ORIENTATION);
+                       if (field == null)
+                               return TiffTagConstants.ORIENTATION_VALUE_HORIZONTAL_NORMAL;
+                       try {
+                               return field.getIntValue();
+                       } catch (ImageReadException e) {
+                               throw new IllegalStateException(e);
+                       }
+               } else {
+                       throw new IllegalArgumentException("Unsupported metadata format " + metadata.getClass());
+               }
+       }
+
+       public static AffineTransform getExifTransformation(Integer orientation, int width, int height) {
+
+               AffineTransform t = new AffineTransform();
+
+               switch (orientation) {
+               case TiffTagConstants.ORIENTATION_VALUE_HORIZONTAL_NORMAL:
+                       return null;
+               case TiffTagConstants.ORIENTATION_VALUE_MIRROR_HORIZONTAL: // Flip X
+                       t.scale(-1.0, 1.0);
+                       t.translate(-width, 0);
+                       break;
+               case TiffTagConstants.ORIENTATION_VALUE_ROTATE_180: // PI rotation
+                       t.translate(width, height);
+                       t.rotate(Math.PI);
+                       break;
+               case TiffTagConstants.ORIENTATION_VALUE_MIRROR_VERTICAL: // Flip Y
+                       t.scale(1.0, -1.0);
+                       t.translate(0, -height);
+                       break;
+               case TiffTagConstants.ORIENTATION_VALUE_MIRROR_HORIZONTAL_AND_ROTATE_270_CW: // - PI/2 and Flip X
+                       t.rotate(-Math.PI / 2);
+                       t.scale(-1.0, 1.0);
+                       break;
+               case TiffTagConstants.ORIENTATION_VALUE_ROTATE_90_CW: // -PI/2 and -width
+                       t.translate(height, 0);
+                       t.rotate(Math.PI / 2);
+                       break;
+               case TiffTagConstants.ORIENTATION_VALUE_MIRROR_HORIZONTAL_AND_ROTATE_90_CW: // PI/2 and Flip
+                       t.scale(-1.0, 1.0);
+                       t.translate(-height, 0);
+                       t.translate(0, width);
+                       t.rotate(3 * Math.PI / 2);
+                       break;
+               case TiffTagConstants.ORIENTATION_VALUE_ROTATE_270_CW: // PI / 2
+                       t.translate(0, width);
+                       t.rotate(3 * Math.PI / 2);
+                       break;
+               }
+
+               return t;
+       }
+
+       public static void main(String[] args) throws Exception {
+               if (args.length < 2)
+                       throw new IllegalArgumentException(
+                                       "Usage: " + ImageProcessor.class.getSimpleName() + " <source image> <target image>");
+               Path imagePath = Paths.get(args[0]);
+               Path targetPath = Paths.get(args[1]);
+
+               System.out.println("## Source metadata:");
+               try (InputStream in = Files.newInputStream(imagePath)) {
+                       metadataExample(in, null);
+               }
+
+               ImageProcessor imageProcessor = new ImageProcessor(() -> Files.newInputStream(imagePath),
+                               () -> Files.newOutputStream(targetPath));
+               imageProcessor.process();
+
+               System.out.println("## Target metadata:");
+               try (InputStream in = Files.newInputStream(targetPath)) {
+                       metadataExample(in, null);
+               }
+
+       }
+
+       public static void metadataExample(InputStream in, String fileName) throws ImageReadException, IOException {
+               // get all metadata stored in EXIF format (ie. from JPEG or TIFF).
+               final ImageMetadata metadata = Imaging.getMetadata(in, fileName);
+
+               // System.out.println(metadata);
+
+               if (metadata instanceof JpegImageMetadata) {
+                       final JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata;
+
+                       // Jpeg EXIF metadata is stored in a TIFF-based directory structure
+                       // and is identified with TIFF tags.
+                       // Here we look for the "x resolution" tag, but
+                       // we could just as easily search for any other tag.
+                       //
+                       // see the TiffConstants file for a list of TIFF tags.
+
+                       // System.out.println("file: " + file.getPath());
+
+                       // print out various interesting EXIF tags.
+                       printTagValue(jpegMetadata, TiffTagConstants.TIFF_TAG_XRESOLUTION);
+                       printTagValue(jpegMetadata, TiffTagConstants.TIFF_TAG_DATE_TIME);
+                       printTagValue(jpegMetadata, ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL);
+                       printTagValue(jpegMetadata, ExifTagConstants.EXIF_TAG_DATE_TIME_DIGITIZED);
+                       printTagValue(jpegMetadata, ExifTagConstants.EXIF_TAG_ISO);
+                       printTagValue(jpegMetadata, ExifTagConstants.EXIF_TAG_SHUTTER_SPEED_VALUE);
+                       printTagValue(jpegMetadata, ExifTagConstants.EXIF_TAG_APERTURE_VALUE);
+                       printTagValue(jpegMetadata, ExifTagConstants.EXIF_TAG_BRIGHTNESS_VALUE);
+                       printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);
+                       printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LATITUDE);
+                       printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);
+                       printTagValue(jpegMetadata, GpsTagConstants.GPS_TAG_GPS_LONGITUDE);
+
+                       System.out.println();
+
+                       // simple interface to GPS data
+                       final TiffImageMetadata exifMetadata = jpegMetadata.getExif();
+                       if (null != exifMetadata) {
+                               final TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS();
+                               if (null != gpsInfo) {
+                                       final String gpsDescription = gpsInfo.toString();
+                                       final double longitude = gpsInfo.getLongitudeAsDegreesEast();
+                                       final double latitude = gpsInfo.getLatitudeAsDegreesNorth();
+
+                                       System.out.println("    " + "GPS Description: " + gpsDescription);
+                                       System.out.println("    " + "GPS Longitude (Degrees East): " + longitude);
+                                       System.out.println("    " + "GPS Latitude (Degrees North): " + latitude);
+                               }
+                       }
+
+                       // more specific example of how to manually access GPS values
+                       final TiffField gpsLatitudeRefField = jpegMetadata
+                                       .findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LATITUDE_REF);
+                       final TiffField gpsLatitudeField = jpegMetadata
+                                       .findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LATITUDE);
+                       final TiffField gpsLongitudeRefField = jpegMetadata
+                                       .findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LONGITUDE_REF);
+                       final TiffField gpsLongitudeField = jpegMetadata
+                                       .findEXIFValueWithExactMatch(GpsTagConstants.GPS_TAG_GPS_LONGITUDE);
+                       if (gpsLatitudeRefField != null && gpsLatitudeField != null && gpsLongitudeRefField != null
+                                       && gpsLongitudeField != null) {
+                               // all of these values are strings.
+                               final String gpsLatitudeRef = (String) gpsLatitudeRefField.getValue();
+                               final RationalNumber[] gpsLatitude = (RationalNumber[]) (gpsLatitudeField.getValue());
+                               final String gpsLongitudeRef = (String) gpsLongitudeRefField.getValue();
+                               final RationalNumber[] gpsLongitude = (RationalNumber[]) gpsLongitudeField.getValue();
+
+                               final RationalNumber gpsLatitudeDegrees = gpsLatitude[0];
+                               final RationalNumber gpsLatitudeMinutes = gpsLatitude[1];
+                               final RationalNumber gpsLatitudeSeconds = gpsLatitude[2];
+
+                               final RationalNumber gpsLongitudeDegrees = gpsLongitude[0];
+                               final RationalNumber gpsLongitudeMinutes = gpsLongitude[1];
+                               final RationalNumber gpsLongitudeSeconds = gpsLongitude[2];
+
+                               // This will format the gps info like so:
+                               //
+                               // gpsLatitude: 8 degrees, 40 minutes, 42.2 seconds S
+                               // gpsLongitude: 115 degrees, 26 minutes, 21.8 seconds E
+
+                               System.out.println("    " + "GPS Latitude: " + gpsLatitudeDegrees.toDisplayString() + " degrees, "
+                                               + gpsLatitudeMinutes.toDisplayString() + " minutes, " + gpsLatitudeSeconds.toDisplayString()
+                                               + " seconds " + gpsLatitudeRef);
+                               System.out.println("    " + "GPS Longitude: " + gpsLongitudeDegrees.toDisplayString() + " degrees, "
+                                               + gpsLongitudeMinutes.toDisplayString() + " minutes, " + gpsLongitudeSeconds.toDisplayString()
+                                               + " seconds " + gpsLongitudeRef);
+
+                       }
+
+                       System.out.println();
+
+                       final List<ImageMetadataItem> items = jpegMetadata.getItems();
+                       for (final ImageMetadataItem item : items) {
+                               System.out.println("    " + "item: " + item);
+
+                       }
+
+                       System.out.println();
+               }
+       }
+
+       private static void printTagValue(final JpegImageMetadata jpegMetadata, final TagInfo tagInfo) {
+               final TiffField field = jpegMetadata.findEXIFValueWithExactMatch(tagInfo);
+               if (field == null) {
+                       System.out.println(tagInfo.name + ": " + "Not Found.");
+               } else {
+                       System.out.println(tagInfo.name + ": " + field.getValueDescription());
+               }
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/library/DocxExtractor.java b/org.argeo.app.core/src/org/argeo/app/library/DocxExtractor.java
new file mode 100644 (file)
index 0000000..c96126c
--- /dev/null
@@ -0,0 +1,355 @@
+package org.argeo.app.library;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.argeo.cms.util.DigestUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+/** Parses a .docx document, trying its best to extract text and table data. */
+public class DocxExtractor {
+       final static String T = "t";
+       final static String TC = "tc";
+       final static String TR = "tr";
+       final static String TBL = "tbl";
+       final static String P = "p";
+       static boolean debug = false;
+
+       final static String PROOF_ERR = "proofErr";
+       final static String TYPE = "type";
+       final static String SPELL_START = "spellStart";
+       final static String SPELL_END = "spellEnd";
+
+       protected List<Tbl> tables = new ArrayList<>();
+       protected List<String> text = new ArrayList<>();
+       protected Map<String, byte[]> media = new TreeMap<>();
+       private Set<String> mediaDigests = new HashSet<>();
+
+       protected void processTextItem(List<String> lines, String str) {
+               lines.add(str);
+       }
+
+       protected boolean skipMedia(String digest) {
+               return false;
+       }
+
+       class DocxHandler extends DefaultHandler {
+
+               private StringBuilder buffer = new StringBuilder();
+               private Tbl currentTbl = null;
+
+               boolean inSpellErr = false;
+               boolean inParagraph = false;
+
+               @Override
+               public void startElement(String uri, String name, String qName, Attributes attributes) throws SAXException {
+                       // System.out.println(localName + " " + qName + " " + uri.hashCode());
+                       if (P.equals(name)) {
+                               if (debug && currentTbl == null)
+                                       System.out.println("# START PARA");
+                               inParagraph = true;
+                       } else if (PROOF_ERR.equals(name)) {
+                               String type = attributes.getValue(uri, TYPE);
+                               if (SPELL_START.equals(type))
+                                       inSpellErr = true;
+                               else if (SPELL_END.equals(type))
+                                       inSpellErr = false;
+
+                       } else if (TBL.equals(name)) {
+                               if (currentTbl != null) {
+                                       Tbl childTbl = new Tbl();
+                                       childTbl.parentTbl = currentTbl;
+                                       currentTbl = childTbl;
+                                       // throw new IllegalStateException("Already an active table");
+                               } else {
+                                       currentTbl = new Tbl();
+                               }
+                       }
+               }
+
+               @Override
+               public void endElement(String uri, String name, String qName) throws SAXException {
+                       if (name.equals(T)) {
+//                             if (inSpellErr) {
+//                                     // do not reset the buffer
+//                                     return;
+//                             }
+
+                               if (currentTbl != null) {
+                                       currentTbl.appendText(buffer.toString());
+                               } else {
+                                       String str = buffer.toString();
+                                       // replace NO-BREAK SPACE by regular space.
+                                       str = str.replace('\u00A0', ' ');
+                                       str = str.strip();
+                                       if (!"".equals(str)) {
+                                               processTextItem(text, str);
+                                       }
+                               }
+                       } else if (name.equals(P)) {
+                               if (debug && currentTbl == null)
+                                       System.out.println("# END PARA");
+                               if (currentTbl != null) {
+                                       currentTbl.currentRow.current.text.append('\n');
+                               } else {
+
+                               }
+                               inParagraph = false;
+                       } else if (name.equals(TC)) {
+                               if (currentTbl != null)
+                                       currentTbl.closeColumn();
+                       } else if (name.equals(TR)) {
+                               if (currentTbl != null)
+                                       currentTbl.closeRow();
+                       } else if (name.equals(TBL)) {
+                               if (currentTbl != null) {
+                                       tables.add(currentTbl);
+                                       if (currentTbl.parentTbl != null)
+                                               currentTbl = currentTbl.parentTbl;
+                                       else
+                                               currentTbl = null;
+                               } else {
+                                       throw new IllegalStateException("Closing a table while none was open.");
+                               }
+                       }
+                       // reset the buffer
+                       buffer.setLength(0);
+               }
+
+               @Override
+               public void characters(char[] ch, int start, int length) throws SAXException {
+                       buffer.append(ch, start, length);
+               }
+
+       }
+
+       public static class Tbl {
+               Tbl parentTbl = null;
+               Tr currentRow = new Tr();
+               List<Tr> rows = new ArrayList<>();
+
+               void appendText(String str) {
+                       currentRow.current.text.append(str);
+               }
+
+               void closeColumn() {
+                       currentRow.columns.add(currentRow.current);
+                       currentRow.current = new Tc();
+               }
+
+               void closeRow() {
+                       rows.add(currentRow);
+                       currentRow = new Tr();
+               }
+
+               public List<Tr> getRows() {
+                       return rows;
+               }
+
+               @Override
+               public String toString() {
+                       StringBuilder sb = new StringBuilder();
+                       for (Tr tr : rows) {
+                               String txt = tr.toString();
+                               sb.append(txt).append('\n');
+                       }
+                       return sb.toString();
+               }
+       }
+
+       public static class Tr {
+               Tc current = new Tc();
+               List<Tc> columns = new ArrayList<>();
+
+               @Override
+               public String toString() {
+                       StringBuilder sb = new StringBuilder();
+                       for (Tc tc : columns) {
+                               sb.append("\"").append(tc.toString()).append("\"").append(',');
+                       }
+                       return sb.toString();
+               }
+
+               public List<Tc> getColumns() {
+                       return columns;
+               }
+
+       }
+
+       public static class Tc {
+               StringBuilder text = new StringBuilder();
+
+               @Override
+               public String toString() {
+                       return text.toString().trim();
+               }
+
+       }
+
+       protected void parse(Reader in) {
+               try {
+                       SAXParserFactory spf = SAXParserFactory.newInstance();
+                       spf.setNamespaceAware(true);
+                       SAXParser saxParser = spf.newSAXParser();
+                       XMLReader xmlReader = saxParser.getXMLReader();
+                       xmlReader.setContentHandler(new DocxHandler());
+                       xmlReader.parse(new InputSource(in));
+               } catch (ParserConfigurationException | SAXException | IOException e) {
+                       throw new RuntimeException("Cannot parse document", e);
+               }
+       }
+
+       public List<String> getText() {
+               return text;
+       }
+
+       public List<Tbl> getTables() {
+               return tables;
+       }
+
+       public Map<String, byte[]> getMedia() {
+               return media;
+       }
+
+       public void load(ZipInputStream zIn) {
+               try {
+                       ZipEntry entry = null;
+                       while ((entry = zIn.getNextEntry()) != null) {
+                               if ("word/document.xml".equals(entry.getName())) {
+                                       try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+                                               byte[] buffer = new byte[2048];
+                                               int len = 0;
+                                               while ((len = zIn.read(buffer)) > 0) {
+                                                       out.write(buffer, 0, len);
+                                               }
+                                               try (Reader reader = new InputStreamReader(new ByteArrayInputStream(out.toByteArray()),
+                                                               StandardCharsets.UTF_8)) {
+                                                       parse(reader);
+                                               }
+                                       }
+                               } else if (entry.getName().startsWith("word/media")) {
+                                       String fileName = entry.getName().substring(entry.getName().lastIndexOf('/') + 1);
+                                       int dotIndex = fileName.lastIndexOf('.');
+                                       String ext = fileName.substring(dotIndex + 1).toLowerCase();
+                                       // we ignore .jfif
+                                       if ("jpeg".equals(ext))
+                                               ext = "jpg";
+                                       fileName = fileName.substring(0, dotIndex) + "." + ext;
+                                       switch (ext) {
+                                       case "png":
+                                       case "jpg":
+                                       case "gif":
+                                       case "bmp":
+                                       case "tiff":
+                                               try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+                                                       byte[] buffer = new byte[2048];
+                                                       int len = 0;
+                                                       while ((len = zIn.read(buffer)) > 0) {
+                                                               out.write(buffer, 0, len);
+                                                       }
+                                                       byte[] bytes = out.toByteArray();
+                                                       String digest = DigestUtils.digest(DigestUtils.MD5, bytes);
+                                                       if (skipMedia(digest))
+                                                               break;
+                                                       if (!mediaDigests.contains(digest)) {
+                                                               media.put(fileName, bytes);
+                                                               mediaDigests.add(digest);
+                                                       }
+                                               }
+                                               break;
+                                       default:
+                                               break;
+                                       }
+                               } else {
+                                       // System.out.println(entry.getName());
+                               }
+                       }
+               } catch (IOException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
+               // throw new IllegalArgumentException("No document.xml found");
+
+       }
+
+//     public static Reader extractDocumentXml(ZipInputStream zIn) throws IOException {
+//             ZipEntry entry = null;
+//             while ((entry = zIn.getNextEntry()) != null) {
+//                     if ("word/document.xml".equals(entry.getName())) {
+//                             try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+//                                     byte[] buffer = new byte[2048];
+//                                     int len = 0;
+//                                     while ((len = zIn.read(buffer)) > 0) {
+//                                             out.write(buffer, 0, len);
+//                                     }
+//                                     return new InputStreamReader(new ByteArrayInputStream(out.toByteArray()), StandardCharsets.UTF_8);
+//                             }
+//                     } else {
+//                             System.out.println(entry.getName());
+//                     }
+//             }
+//             throw new IllegalArgumentException("No document.xml found");
+//     }
+
+//     protected static ZipInputStream openAsZip(String file) throws IOException {
+//             ZipInputStream zIn;
+//             Path path = Paths.get(file);
+//             zIn = new ZipInputStream(Files.newInputStream(path));
+//             return zIn;
+//     }
+
+       public static void main(String[] args) throws IOException {
+               if (args.length == 0)
+                       throw new IllegalArgumentException("Provide a file path");
+               Path p = Paths.get(args[0]);
+
+               DocxExtractor importer = new DocxExtractor();
+               try (ZipInputStream zIn = new ZipInputStream(Files.newInputStream(p))) {
+                       importer.load(zIn);
+               }
+               // display
+               System.out.println("## TEXT");
+               for (int i = 0; i < importer.text.size(); i++) {
+                       String str = importer.text.get(i);
+                       System.out.println(str);
+               }
+
+               System.out.println("\n");
+
+               for (int i = 0; i < importer.tables.size(); i++) {
+                       Tbl tbl = importer.tables.get(i);
+                       System.out.println("## TABLE " + i);
+                       System.out.println(tbl);
+               }
+
+               System.out.println("## MEDIA");
+               for (String fileName : importer.media.keySet()) {
+                       int sizeKb = importer.media.get(fileName).length / 1024;
+                       System.out.println(fileName + " " + sizeKb + " kB");
+               }
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/odk/OdkNames.java b/org.argeo.app.core/src/org/argeo/app/odk/OdkNames.java
new file mode 100644 (file)
index 0000000..7702f83
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.app.odk;
+
+/** Names related to ODK. */
+public interface OdkNames {
+
+       public final static String H_HTML = "h:html";
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/odk/OrxListName.java b/org.argeo.app.core/src/org/argeo/app/odk/OrxListName.java
new file mode 100644 (file)
index 0000000..3c432ad
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.app.odk;
+
+import org.argeo.api.acr.QNamed;
+
+/** Types related to the http://openrosa.org/xforms/xformsList namespace. */
+public enum OrxListName implements QNamed {
+       xform,
+       // names
+       formID, version;
+
+       @Override
+       public String getDefaultPrefix() {
+               return "orxList";
+       }
+
+       @Override
+       public String getNamespace() {
+               return "http://openrosa.org/xforms/xformsList";
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/odk/OrxManifestName.java b/org.argeo.app.core/src/org/argeo/app/odk/OrxManifestName.java
new file mode 100644 (file)
index 0000000..2b68b90
--- /dev/null
@@ -0,0 +1,19 @@
+package org.argeo.app.odk;
+
+import org.argeo.api.acr.QNamed;
+
+/** Types related to the http://openrosa.org/xforms/xformsList namespace. */
+public enum OrxManifestName implements QNamed {
+       manifest, mediaFile;
+
+       @Override
+       public String getDefaultPrefix() {
+               return "orxManifest";
+       }
+
+       @Override
+       public String getNamespace() {
+               return "http://openrosa.org/xforms/xformsManifest";
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/odk/OrxType.java b/org.argeo.app.core/src/org/argeo/app/odk/OrxType.java
new file mode 100644 (file)
index 0000000..77ae7ae
--- /dev/null
@@ -0,0 +1,19 @@
+package org.argeo.app.odk;
+
+import org.argeo.api.acr.QNamed;
+
+/** Types related to the http://openrosa.org/xforms/xformsList namespace. */
+public enum OrxType implements QNamed {
+       submission, xml_submission_file;
+
+       @Override
+       public String getDefaultPrefix() {
+               return "orx";
+       }
+
+       @Override
+       public String getNamespace() {
+               return "http://openrosa.org/xforms";
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/AbstractArgeoApp.java b/org.argeo.app.core/src/org/argeo/app/ux/AbstractArgeoApp.java
new file mode 100644 (file)
index 0000000..2bb9c6a
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.app.ux;
+
+import org.argeo.cms.AbstractCmsApp;
+
+public abstract class AbstractArgeoApp extends AbstractCmsApp {
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/AppUi.java b/org.argeo.app.core/src/org/argeo/app/ux/AppUi.java
new file mode 100644 (file)
index 0000000..83e2926
--- /dev/null
@@ -0,0 +1,11 @@
+package org.argeo.app.ux;
+
+import org.argeo.api.cms.ux.CmsUi;
+import org.argeo.cms.Localized;
+
+public interface AppUi extends CmsUi {
+       Localized getTitle();
+       
+       boolean isLoginScreen();
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteIcon.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteIcon.java
new file mode 100644 (file)
index 0000000..7ae9360
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.app.ux;
+
+import org.argeo.api.cms.ux.CmsIcon;
+
+/** Icon names used by Argeo Suite. */
+public enum SuiteIcon implements CmsIcon {
+       add, save, close, closeAll, search, delete, logout, dashboard,
+       // people
+       people, group, person, organisation, addressBook, users, organisationContact,
+       // library
+       documents, document, folder,
+       // management
+       report,
+       // admin and settings
+       settings, user,
+       // misc
+       task, tag, location, inbox, map, todo,
+       // actions
+       openUserMenu,
+       //
+       ;
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteMsg.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteMsg.java
new file mode 100644 (file)
index 0000000..d244bd3
--- /dev/null
@@ -0,0 +1,45 @@
+package org.argeo.app.ux;
+
+import org.argeo.cms.Localized;
+
+/** Localized messages. */
+public enum SuiteMsg implements Localized {
+       // Entities
+       user, org, person, group,
+       // UI parts
+       dashboard, people, documents, locations, recentItems,
+       // NewPersonWizard
+       firstName, lastName, salutation, email, personWizardWindowTitle, personWizardPageTitle, personWizardFeedback,
+       // NewOrgWizard
+       orgWizardWindowTitle, orgWizardPageTitle, orgWizardFeedback, legalName, legalForm, vatId,
+       // Roles
+       userAdminRole, groupAdminRole, publisherRole, coworkerRole,
+       // Group
+       chooseAMember,
+       // ContextAddressComposite
+       chooseAnOrganisation, street, streetComplement, zipCode, city, state, country, geopoint,
+       // FilteredOrderableEntityTable
+       filterHelp,
+       // BankAccountComposite
+       accountHolder, bankName, currency, accountNumber, bankNumber, BIC, IBAN,
+       // EditJobDialog
+       position, chosenItem, department, isPrimary, searchAndChooseEntity,
+       // ContactListCTab (e4)
+       notes, addAContact, contactValue, linkedCompany,
+       // OrgAdminInfoCTab (e4)
+       paymentAccount,
+       // OrgEditor (e4)
+       orgDetails, orgActivityLog, team, orgAdmin,
+       // PersonEditor (e4)
+       personDetails, personActivityLog, personOrgs, personSecurity,
+       // PersonSecurityCTab (e4)
+       resetPassword,
+       // Generic
+       label, aCustomLabel, description, value, name, primary, add, save, pickup,
+       // Tag
+       confirmNewTag, cannotCreateTag,
+       // Feedback messages
+       allFieldsMustBeSet,
+       //
+       ;
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteStyle.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteStyle.java
new file mode 100644 (file)
index 0000000..a115210
--- /dev/null
@@ -0,0 +1,35 @@
+package org.argeo.app.ux;
+
+import org.argeo.api.cms.ux.CmsStyle;
+
+/** Styles used by Argeo Suite work UI. */
+public enum SuiteStyle implements CmsStyle {
+       // header
+       header, headerTitle, headerMenu, headerMenuItem,
+       // footer
+       footer,
+       // recent items
+       recentItems,
+       // lead pane
+       leadPane, leadPaneItem, leadPaneSectionTitle, leadPaneSubSectionTitle,
+       // entry area
+       entryArea,
+       // group composite
+       titleContainer, titleLabel, subTitleLabel, formLine, formColumn, navigationBar, navigationTitle, navigationButton,
+       // forms elements
+       simpleLabel, simpleText, simpleInput,
+       // table
+       titleCell,
+       // layers
+       workArea,
+       // tabbed area
+       mainTabBody, mainTabSelected, mainTab,
+       // buttons
+       inlineButton;
+
+       @Override
+       public String getClassPrefix() {
+               return "argeo-suite";
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/SuiteUxEvent.java b/org.argeo.app.core/src/org/argeo/app/ux/SuiteUxEvent.java
new file mode 100644 (file)
index 0000000..00b65f4
--- /dev/null
@@ -0,0 +1,34 @@
+package org.argeo.app.ux;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.CmsEvent;
+
+/** Events specific to Argeo Suite UX. */
+public enum SuiteUxEvent implements CmsEvent {
+       openNewPart, refreshPart, switchLayer;
+
+       public final static String LAYER = "layer";
+//     public final static String USERNAME = "username";
+
+       // ACR
+       public final static String CONTENT_PATH = "contentPath";
+
+       public String getTopicBase() {
+               return "argeo.suite.ui";
+       }
+
+       public static Map<String, Object> eventProperties(Content content) {
+               Map<String, Object> properties = new HashMap<>();
+               properties.put(CONTENT_PATH, content.getPath());
+               return properties;
+       }
+
+//     public static Map<String, Object> eventProperties(User user) {
+//             Map<String, Object> properties = new HashMap<>();
+//             properties.put(USERNAME, user.getName());
+//             return properties;
+//     }
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/js/AbstractJsObject.java b/org.argeo.app.core/src/org/argeo/app/ux/js/AbstractJsObject.java
new file mode 100644 (file)
index 0000000..3e13b68
--- /dev/null
@@ -0,0 +1,114 @@
+package org.argeo.app.ux.js;
+
+import java.util.Optional;
+
+public abstract class AbstractJsObject {
+       /**
+        * JavaScript expression returning a reference to the object. It can be either a
+        * variable or a function call. If it is not set the object is assumed to be a
+        * new.
+        */
+       private String reference;
+
+       private JsClient jsClient;
+
+       private Object[] jsConstructorArgs;
+
+//     public AbstractJsObject(JsClient jsClient, String reference) {
+//             Objects.requireNonNull(jsClient);
+//             Objects.requireNonNull(reference, "JS reference cannot be null");
+//             this.jsClient = jsClient;
+//             this.reference = reference;
+//     }
+
+       public AbstractJsObject(Object... args) {
+               if (args.length == 2 && args[0] instanceof JsClient jsClient) {
+                       this.jsClient = jsClient;
+                       this.reference = args[1].toString();
+               } else {
+                       this.jsConstructorArgs = args;
+               }
+       }
+
+       public abstract String getJsPackage();
+
+       public void create(JsClient jsClient, String varName) {
+               if (!isNew())
+                       throw new IllegalStateException("JS object " + getJsClassName() + " is not new");
+               if (isFunctionReference())
+                       throw new IllegalStateException(
+                                       "JS object " + getJsClassName() + " cannot be created since it is a function reference");
+               jsClient.execute(jsClient.getJsVarName(varName) + " = " + newJs() + ";");
+               reference = varName;
+               this.jsClient = jsClient;
+       }
+
+       public void delete() {
+               if (isNew())
+                       throw new IllegalStateException(
+                                       "JS object " + getJsClassName() + " cannot be deleted since it is anonymous");
+               if (isFunctionReference())
+                       throw new IllegalStateException(
+                                       "JS object " + getJsClassName() + " cannot be deleted since it is a function reference");
+               jsClient.execute(reference + " = undefined; delete " + reference + ";");
+       }
+
+       public boolean isNew() {
+               return reference == null;
+       }
+
+       public boolean isFunctionReference() {
+               return !isNew() && !getReference().endsWith(")");
+       }
+
+       public String getReference() {
+               return reference;
+       }
+
+       protected String getJsReference() {
+               return jsClient.getJsVarName(reference);
+       }
+
+       protected String newJs() {
+               StringBuilder sb = new StringBuilder();
+               sb.append("new ");
+               sb.append(getJsClassName());
+               sb.append("(");
+               sb.append(JsClient.toJsArgs(jsConstructorArgs));
+               sb.append(")");
+               return sb.toString();
+       }
+
+       public String getJsClassName() {
+               return getJsPackage() + "." + getClass().getSimpleName();
+       }
+
+       public Object callMethod(String methodName, Object... args) {
+               return jsClient.callMethod(getJsReference(), methodName + "(" + JsClient.toJsArgs(args) + ")");
+       }
+
+       public void executeMethod(String methodName, Object... args) {
+               jsClient.executeMethod(getJsReference(), methodName + "(" + JsClient.toJsArgs(args) + ")");
+       }
+
+       protected String getMethodName() {
+               StackWalker walker = StackWalker.getInstance();
+               Optional<String> methodName = walker.walk(frames -> {
+                       return frames.skip(1).findFirst().map(StackWalker.StackFrame::getMethodName);
+               });
+               return methodName.orElseThrow();
+       }
+
+       protected JsClient getJsClient() {
+               return jsClient;
+       }
+
+       protected Object[] getJsConstructorArgs() {
+               return jsConstructorArgs;
+       }
+
+       protected void setJsConstructorArgs(Object[] jsConstructorArgs) {
+               this.jsConstructorArgs = jsConstructorArgs;
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/js/JsClient.java b/org.argeo.app.core/src/org/argeo/app/ux/js/JsClient.java
new file mode 100644 (file)
index 0000000..708daff
--- /dev/null
@@ -0,0 +1,153 @@
+package org.argeo.app.ux.js;
+
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.concurrent.CompletionStage;
+import java.util.function.Function;
+
+/**
+ * A remote JavaScript view (typically in a web browser) which is tightly
+ * integrated with a local UX part.
+ */
+public interface JsClient {
+
+       /*
+        * TO IMPLEMENT
+        */
+
+       /**
+        * Execute this JavaScript on the client side after making sure that the page
+        * has been loaded and the map object has been created.
+        * 
+        * @param js   the JavaScript code, possibly formatted according to
+        *             {@link String#format}, with {@link Locale#ROOT} as locale (for
+        *             stability of decimal separator, as expected by JavaScript.
+        * @param args the optional arguments of
+        *             {@link String#format(String, Object...)}
+        */
+       Object evaluate(String js, Object... args);
+
+       /**
+        * Executes this JavaScript without expecting a return value.
+        * 
+        * @param js   the JavaScript code, possibly formatted according to
+        *             {@link String#format}, with {@link Locale#ROOT} as locale (for
+        *             stability of decimal separator, as expected by JavaScript.
+        * @param args the optional arguments of
+        *             {@link String#format(String, Object...)}
+        */
+       void execute(String js, Object... args);
+
+       /** @return the globally usable function name. */
+       String createJsFunction(String name, Function<Object[], Object> toDo);
+
+       /** Get a global variable name. */
+       String getJsVarName(String name);
+
+       /**
+        * Completion stage when the client is ready (typically the page has loaded in
+        * the browser).
+        */
+       CompletionStage<Boolean> getReadyStage();
+
+       /*
+        * DEFAULTS
+        */
+
+       default Object callMethod(String jsObject, String methodCall, Object... args) {
+               return evaluate(jsObject + '.' + methodCall, args);
+       }
+
+       default void executeMethod(String jsObject, String methodCall, Object... args) {
+               execute(jsObject + '.' + methodCall, args);
+       }
+
+       default boolean isInstanceOf(String reference, String jsClass) {
+               try {
+                       return (Boolean) evaluate("return " + getJsVarName(reference) + " instanceof " + jsClass);
+               } catch (Exception e) {
+                       // TODO better understand why instanceof is often failing with SWT Browser
+                       return false;
+               }
+       }
+
+       /*
+        * UTILITIES
+        */
+
+       static String toJsValue(Object o) {
+               if (o instanceof CharSequence)
+                       return '\'' + o.toString() + '\'';
+               else if (o instanceof Number)
+                       return o.toString();
+               else if (o instanceof Boolean)
+                       return o.toString();
+               else if (o instanceof Map map)
+                       return toJsMap(map);
+               else if (o instanceof Object[] arr)
+                       return toJsArray(arr);
+               else if (o instanceof int[] arr)
+                       return toJsArray(arr);
+               else if (o instanceof long[] arr)
+                       return toJsArray(arr);
+               else if (o instanceof double[] arr)
+                       return toJsArray(arr);
+               else if (o instanceof AbstractJsObject jsObject) {
+                       if (jsObject.isNew())
+                               return jsObject.newJs();
+                       else
+                               return jsObject.getJsReference();
+               } else if (o instanceof JsReference jsReference) {
+                       return jsReference.get();
+               } else
+                       return '\'' + o.toString() + '\'';
+       }
+
+       static String toJsArgs(Object... arr) {
+               StringJoiner sj = new StringJoiner(",");
+               for (Object o : arr) {
+                       sj.add(toJsValue(o));
+               }
+               return sj.toString();
+       }
+
+       static String toJsArray(Object... arr) {
+               StringJoiner sj = new StringJoiner(",", "[", "]");
+               for (Object o : arr) {
+                       sj.add(toJsValue(o));
+               }
+               return sj.toString();
+       }
+
+       static String toJsArray(String... arr) {
+               return toJsArray((Object[]) arr);
+       }
+
+       static String toJsArray(double... arr) {
+               return Arrays.toString(arr);
+       }
+
+       static String toJsArray(long... arr) {
+               return Arrays.toString(arr);
+       }
+
+       static String toJsArray(int... arr) {
+               return Arrays.toString(arr);
+       }
+
+       static String toJsMap(Map<?, ?> map) {
+               StringJoiner sj = new StringJoiner(",", "{", "}");
+               // TODO escape forbidden characters
+               for (Object key : map.keySet()) {
+                       sj.add("'" + key + "':" + toJsValue(map.get(key)));
+               }
+               return sj.toString();
+       }
+
+       static String escapeQuotes(String str) {
+               return str.replace("'", "\\'").replace("\"", "\\\"");
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/ux/js/JsReference.java b/org.argeo.app.core/src/org/argeo/app/ux/js/JsReference.java
new file mode 100644 (file)
index 0000000..0cd8d81
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.app.ux.js;
+
+import java.util.function.Supplier;
+
+/** Plain JS reference, to be directly serialised. */
+public class JsReference implements Supplier<String> {
+       private final String reference;
+
+       public JsReference(String reference) {
+               this.reference = reference;
+       }
+
+       public String get() {
+               return reference;
+       }
+
+}
diff --git a/org.argeo.app.core/src/org/argeo/app/xforms/FormSubmissionListener.java b/org.argeo.app.core/src/org/argeo/app/xforms/FormSubmissionListener.java
new file mode 100644 (file)
index 0000000..feea106
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.app.xforms;
+
+import org.argeo.api.acr.Content;
+
+/** Called when a user has received a new form submission. */
+public interface FormSubmissionListener {
+       final static String XML_SUBMISSION_FILE = "xml_submission_file";
+       
+       /**
+        * Called after a form submission has been stored in the user area. The
+        * submission will be deleted if any exception is thrown.
+        */
+       void formSubmissionReceived(Content content, boolean isIncomplete);
+}
diff --git a/org.argeo.app.geo/.classpath b/org.argeo.app.geo/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.geo/.project b/org.argeo.app.geo/.project
new file mode 100644 (file)
index 0000000..a41594e
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.geo</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.geo/.settings/org.eclipse.core.resources.prefs b/org.argeo.app.geo/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..99f26c0
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.argeo.app.geo/.settings/org.eclipse.jdt.core.prefs b/org.argeo.app.geo/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..62ef348
--- /dev/null
@@ -0,0 +1,9 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/org.argeo.app.geo/.settings/org.eclipse.pde.core.prefs b/org.argeo.app.geo/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..f29e940
--- /dev/null
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.argeo.app.geo/OSGI-INF/wfsHttpHandler.xml b/org.argeo.app.geo/OSGI-INF/wfsHttpHandler.xml
new file mode 100644 (file)
index 0000000..8a08f57
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true">
+   <implementation class="org.argeo.app.geo.http.WfsHttpHandler"/>
+   <service>
+      <provide interface="com.sun.net.httpserver.HttpHandler"/>
+   </service>
+   <property name="context.path" type="String" value="/api/wfs/" />
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.spi.ProvidedRepository" name="ProvidedRepository" policy="static"/>
+   <reference bind="addFeatureAdapter" cardinality="0..n" interface="org.argeo.api.app.geo.FeatureAdapter" name="FeatureAdapter" policy="dynamic" unbind="removeFeatureAdapter"/>
+</scr:component>
diff --git a/org.argeo.app.geo/bnd.bnd b/org.argeo.app.geo/bnd.bnd
new file mode 100644 (file)
index 0000000..37b6d31
--- /dev/null
@@ -0,0 +1,8 @@
+Import-Package:\
+tech.units.indriya.unit,\
+com.fasterxml.jackson.core,\
+org.geotools.xml.transform,\
+*
+
+Service-Component:\
+OSGI-INF/wfsHttpHandler.xml,\
diff --git a/org.argeo.app.geo/build.properties b/org.argeo.app.geo/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.argeo.app.geo/src/org/argeo/api/app/geo/FeatureAdapter.java b/org.argeo.app.geo/src/org/argeo/api/app/geo/FeatureAdapter.java
new file mode 100644 (file)
index 0000000..e0449e1
--- /dev/null
@@ -0,0 +1,18 @@
+package org.argeo.api.app.geo;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.search.AndFilter;
+import org.locationtech.jts.geom.Geometry;
+
+import jakarta.json.stream.JsonGenerator;
+
+/** Transform a {@link Content} to an OGC feature. */
+public interface FeatureAdapter {
+       Geometry getDefaultGeometry(Content c, QName targetFeature);
+
+       void writeProperties(JsonGenerator g, Content content, QName targetFeature);
+
+       void addConstraintsForFeature(AndFilter filter, QName targetFeature);
+}
diff --git a/org.argeo.app.geo/src/org/argeo/api/app/geo/WfsKvp.java b/org.argeo.app.geo/src/org/argeo/api/app/geo/WfsKvp.java
new file mode 100644 (file)
index 0000000..a6eb5d7
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.api.app.geo;
+
+/** Keys used for WFS KVP (key-value pair) encoding. */
+public enum WfsKvp {
+       CQL_FILTER("cql_filter"), //
+       OUTPUT_FORMAT("outputFormat"), //
+       TYPE_NAMES("typeNames"), //
+       BBOX("bbox"), //
+       FORMAT_OPTIONS("format_options"), //
+       ;
+
+       public final static String FILENAME_ = "filename:";
+
+       private final String key;
+
+       private WfsKvp(String key) {
+               this.key = key;
+       }
+
+       public String getKey() {
+               return key;
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/CqlUtils.java b/org.argeo.app.geo/src/org/argeo/app/geo/CqlUtils.java
new file mode 100644 (file)
index 0000000..2186c54
--- /dev/null
@@ -0,0 +1,59 @@
+package org.argeo.app.geo;
+
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.search.AndFilter;
+import org.argeo.api.acr.search.BasicSearch;
+import org.argeo.api.acr.search.ContentFilter;
+import org.geotools.api.filter.And;
+import org.geotools.api.filter.Filter;
+import org.geotools.api.filter.PropertyIsEqualTo;
+import org.geotools.api.filter.expression.Literal;
+import org.geotools.api.filter.expression.PropertyName;
+import org.geotools.filter.text.cql2.CQL;
+import org.geotools.filter.text.cql2.CQLException;
+
+/** Utilities around the CQL query format. */
+public class CqlUtils {
+
+       public static void filter(BasicSearch search, String cql) {
+               try {
+                       filter(search, CQL.toFilter(cql));
+               } catch (CQLException e) {
+                       throw new IllegalArgumentException("Cannot parse CQL: " + cql, e);
+               }
+       }
+
+       public static void filter(BasicSearch search, Filter filter) {
+               search.where((where) -> {
+                       if (filter instanceof And and) {
+                               processAnd(where, and);
+                       } else if (filter instanceof PropertyIsEqualTo propertyIsEqualTo) {
+                               processIsEqualTo(where, propertyIsEqualTo);
+                       } else {
+                               throw new IllegalArgumentException("Unsupported filter " + filter.getClass());
+                       }
+               });
+       }
+
+       private static void processAnd(AndFilter contentFilter, And filter) {
+               for (Filter child : filter.getChildren()) {
+                       if (child instanceof PropertyIsEqualTo propertyIsEqualTo) {
+                               processIsEqualTo(contentFilter, propertyIsEqualTo);
+                       }
+               }
+
+       }
+
+       private static void processIsEqualTo(ContentFilter<?> contentFilter, PropertyIsEqualTo propertyIsEqualTo) {
+               // TODO properly deal with types etc.
+               // see GeoTools org.geotools.filter.text.commons.ExpressionToText
+               PropertyName propertyName = (PropertyName) propertyIsEqualTo.getExpression1();
+               Literal value = (Literal) propertyIsEqualTo.getExpression2();
+               // String escaped = literal.toString().replaceAll("'", "''");
+               contentFilter.eq(NamespaceUtils.parsePrefixedName(propertyName.toString()), value.toString());
+       }
+
+       /** singleton */
+       private CqlUtils() {
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GeoJson.java b/org.argeo.app.geo/src/org/argeo/app/geo/GeoJson.java
new file mode 100644 (file)
index 0000000..8c4c7b2
--- /dev/null
@@ -0,0 +1,172 @@
+package org.argeo.app.geo;
+
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Envelope;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryCollection;
+import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.LinearRing;
+import org.locationtech.jts.geom.MultiPoint;
+import org.locationtech.jts.geom.Point;
+import org.locationtech.jts.geom.Polygon;
+
+import jakarta.json.JsonArray;
+import jakarta.json.JsonObject;
+import jakarta.json.stream.JsonGenerator;
+
+/**
+ * GeoJSon format.
+ * 
+ * @see https://datatracker.ietf.org/doc/html/rfc7946
+ */
+public class GeoJson {
+       public final static String POINT_TYPE = "Point";
+       public final static String MULTI_POINT_TYPE = "MultiPoint";
+       public final static String LINE_STRING_TYPE = "LineString";
+       public final static String POLYGON_TYPE = "Polygon";
+       public final static String GEOMETRY_COLLECTION_TYPE = "GeometryCollection";
+
+       public final static String TYPE = "type";
+       public final static String GEOMETRY = "geometry";
+       public final static String GEOMETRIES = "geometries";
+       public final static String COORDINATES = "coordinates";
+       public final static String BBOX = "bbox";
+       public final static String PROPERTIES = "properties";
+
+       /*
+        * WRITE
+        */
+       /** Writes a {@link Geometry} as GeoJSON. */
+       public static void writeGeometry(JsonGenerator g, Geometry geometry) {
+               if (geometry instanceof Point point) {
+                       g.write(TYPE, POINT_TYPE);
+                       g.writeStartArray(COORDINATES);
+                       writeCoordinate(g, point.getCoordinate());
+                       g.writeEnd();// coordinates array
+               } else if (geometry instanceof MultiPoint multiPoint) {
+                       g.write(TYPE, MULTI_POINT_TYPE);
+                       g.writeStartArray(COORDINATES);
+                       writeCoordinates(g, multiPoint.getCoordinates());
+                       g.writeEnd();// coordinates array
+               } else if (geometry instanceof LineString lineString) {
+                       g.write(TYPE, LINE_STRING_TYPE);
+                       g.writeStartArray(COORDINATES);
+                       writeCoordinates(g, lineString.getCoordinates());
+                       g.writeEnd();// coordinates array
+               } else if (geometry instanceof Polygon polygon) {
+                       g.write(TYPE, POLYGON_TYPE);
+                       g.writeStartArray(COORDINATES);
+                       LinearRing exteriorRing = polygon.getExteriorRing();
+                       g.writeStartArray();
+                       writeCoordinates(g, exteriorRing.getCoordinates());
+                       g.writeEnd();
+                       for (int i = 0; i < polygon.getNumInteriorRing(); i++) {
+                               LinearRing interiorRing = polygon.getInteriorRingN(i);
+                               // TODO verify that holes are clockwise
+                               g.writeStartArray();
+                               writeCoordinates(g, interiorRing.getCoordinates());
+                               g.writeEnd();
+                       }
+                       g.writeEnd();// coordinates array
+               } else if (geometry instanceof GeometryCollection geometryCollection) {// must be last
+                       g.write(TYPE, GEOMETRY_COLLECTION_TYPE);
+                       g.writeStartArray(GEOMETRIES);
+                       for (int i = 0; i < geometryCollection.getNumGeometries(); i++) {
+                               g.writeStartObject();
+                               writeGeometry(g, geometryCollection.getGeometryN(i));
+                               g.writeEnd();// geometry object
+                       }
+                       g.writeEnd();// geometries array
+               } else {
+                       throw new IllegalArgumentException(geometry.getClass() + " is not supported.");
+               }
+       }
+
+       /** Writes a sequence of coordinates [[lat,lon],[lat,lon]] */
+       public static void writeCoordinates(JsonGenerator g, Coordinate[] coordinates) {
+               for (Coordinate coordinate : coordinates) {
+                       g.writeStartArray();
+                       writeCoordinate(g, coordinate);
+                       g.writeEnd();
+               }
+       }
+
+       /** Writes a pair of coordinates [lat,lon]. */
+       public static void writeCoordinate(JsonGenerator g, Coordinate coordinate) {
+               // !! longitude is first in GeoJSON
+               g.write(coordinate.getY());
+               g.write(coordinate.getX());
+               double z = coordinate.getZ();
+               if (!Double.isNaN(z)) {
+                       g.write(z);
+               }
+       }
+
+       /**
+        * Writes the {@link Envelope} of a {@link Geometry} as a bbox GeoJSON object.
+        */
+       public static void writeBBox(JsonGenerator g, Geometry geometry) {
+               g.writeStartArray(BBOX);
+               Envelope envelope = geometry.getEnvelopeInternal();
+               g.write(envelope.getMinX());
+               g.write(envelope.getMinY());
+               g.write(envelope.getMaxX());
+               g.write(envelope.getMaxY());
+               g.writeEnd();
+       }
+
+       /*
+        * READ
+        */
+       /** Reads a geometry from the geometry object of a GEoJSON feature. */
+       @SuppressWarnings("unchecked")
+       public static <T extends Geometry> T readGeometry(JsonObject geom, Class<T> clss) {
+               String type = geom.getString(TYPE);
+               JsonArray coordinates = geom.getJsonArray(COORDINATES);
+               Geometry res = switch (type) {
+               case POINT_TYPE: {
+                       Coordinate coord = readCoordinate(coordinates);
+                       yield JTS.GEOMETRY_FACTORY_WGS84.createPoint(coord);
+               }
+               case LINE_STRING_TYPE: {
+                       Coordinate[] coords = readCoordinates(coordinates);
+                       yield JTS.GEOMETRY_FACTORY_WGS84.createLineString(coords);
+               }
+               case POLYGON_TYPE: {
+                       assert coordinates.size() > 0;
+                       LinearRing exterior = JTS.GEOMETRY_FACTORY_WGS84
+                                       .createLinearRing(readCoordinates(coordinates.getJsonArray(0)));
+                       LinearRing[] holes = new LinearRing[coordinates.size() - 1];
+                       for (int i = 0; i < coordinates.size() - 1; i++) {
+                               holes[i] = JTS.GEOMETRY_FACTORY_WGS84
+                                               .createLinearRing(readCoordinates(coordinates.getJsonArray(i + 1)));
+                       }
+                       yield JTS.GEOMETRY_FACTORY_WGS84.createPolygon(exterior, holes);
+               }
+               default:
+                       throw new IllegalArgumentException("Unexpected value: " + type);
+               };
+//             res.normalize();
+               return (T) res;
+       }
+
+       /** Reads a coordinate pair [lon,lat]. */
+       public static Coordinate readCoordinate(JsonArray arr) {
+               assert arr.size() >= 2;
+               // !! longitude is first in GeoJSon
+               return new Coordinate(arr.getJsonNumber(1).doubleValue(), arr.getJsonNumber(0).doubleValue());
+       }
+
+       /** Reads a coordinate sequence [[lon,lat],[lon,lat]]. */
+       public static Coordinate[] readCoordinates(JsonArray arr) {
+               Coordinate[] coords = new Coordinate[arr.size()];
+               for (int i = 0; i < arr.size(); i++)
+                       coords[i] = readCoordinate(arr.getJsonArray(i));
+               return coords;
+       }
+
+       /** singleton */
+       private GeoJson() {
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GeoJsonUtils.java b/org.argeo.app.geo/src/org/argeo/app/geo/GeoJsonUtils.java
new file mode 100644 (file)
index 0000000..84610c8
--- /dev/null
@@ -0,0 +1,24 @@
+package org.argeo.app.geo;
+
+import java.util.Map;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/** Geo data utilities. */
+public class GeoJsonUtils {
+
+       /** Add these properties to all features. */
+       public static void addProperties(JsonNode tree, Map<String, String> map) {
+               for (JsonNode feature : tree.get("features")) {
+                       ObjectNode properties = (ObjectNode) feature.get("properties");
+                       for (String key : map.keySet()) {
+                               properties.put(key, map.get(key));
+                       }
+               }
+       }
+
+       /** Singleton. */
+       private GeoJsonUtils() {
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GeoShapeUtils.java b/org.argeo.app.geo/src/org/argeo/app/geo/GeoShapeUtils.java
new file mode 100644 (file)
index 0000000..d35492a
--- /dev/null
@@ -0,0 +1,100 @@
+package org.argeo.app.geo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringTokenizer;
+
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.MultiPoint;
+import org.locationtech.jts.geom.Point;
+import org.locationtech.jts.geom.Polygon;
+
+/** Utilities around ODK's GeoShape format */
+public class GeoShapeUtils {
+
+       @SuppressWarnings("unchecked")
+       public static <T> T geoShapeToGeometry(String geoShape, Class<T> clss) {
+               Objects.requireNonNull(geoShape);
+               GeometryFactory geometryFactory = JTS.GEOMETRY_FACTORY_WGS84;
+               List<Coordinate> coordinates = new ArrayList<>();
+               StringTokenizer stSeg = new StringTokenizer(geoShape.trim(), ";");
+               while (stSeg.hasMoreTokens()) {
+                       StringTokenizer stPt = new StringTokenizer(stSeg.nextToken().trim(), " ");
+                       String lat = stPt.nextToken();
+                       String lng = stPt.nextToken();
+                       String alt = stPt.nextToken();
+                       // String precision = stPt.nextToken();
+                       Coordinate coord;
+                       if (!alt.equals("0.0")) {
+                               coord = new Coordinate(Double.parseDouble(lat), Double.parseDouble(lng), Double.parseDouble(alt));
+                       } else {
+                               coord = new Coordinate(Double.parseDouble(lat), Double.parseDouble(lng));
+                       }
+                       coordinates.add(coord);
+               }
+               if (LineString.class.isAssignableFrom(clss)) {
+                       LineString lineString = geometryFactory
+                                       .createLineString(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       return (T) lineString;
+               } else if (MultiPoint.class.isAssignableFrom(clss)) {
+                       MultiPoint multiPoint = geometryFactory
+                                       .createMultiPointFromCoords(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       return (T) multiPoint;
+               } else if (Polygon.class.isAssignableFrom(clss)) {
+                       Coordinate first = coordinates.get(0);
+                       Coordinate last = coordinates.get(coordinates.size() - 1);
+                       if (!(first.getX() == last.getX() && first.getY() == last.getY())) {
+                               // close the line string
+                               coordinates.add(first);
+                       }
+                       Polygon polygon = geometryFactory.createPolygon(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       return (T) polygon;
+               } else {
+                       throw new IllegalArgumentException("Unsupported format " + clss);
+               }
+       }
+
+       /** Converts a {@link Geometry} with WGS84 coordinates to a GeoShape. */
+       public static String geometryToGeoShape(Geometry geometry) {
+               if (geometry instanceof Point point) {
+                       Coordinate coordinate = point.getCoordinate();
+                       StringBuilder sb = new StringBuilder();
+                       appendToGeoShape(sb, coordinate.getX(), coordinate.getY(), coordinate.getZ());
+                       return sb.toString();
+               } else if (geometry instanceof Polygon || geometry instanceof LineString) {
+                       StringBuilder sb = new StringBuilder();
+                       for (Coordinate coordinate : geometry.getCoordinates()) {
+                               appendToGeoShape(sb, coordinate.getX(), coordinate.getY(), coordinate.getZ());
+                               sb.append(';');
+                       }
+                       return sb.toString();
+               } else {
+                       throw new IllegalArgumentException("Unsupported geometry " + geometry.getClass());
+               }
+       }
+
+       public static String geoPointToGeoShape(double lon, double lat, double alt) {
+               StringBuilder sb = new StringBuilder();
+               appendToGeoShape(sb, lon, lat, alt);
+               return sb.toString();
+       }
+
+       private static void appendToGeoShape(StringBuilder sb, double lon, double lat, double alt) {
+               sb.append(lat).append(' ');
+               sb.append(lon).append(' ');
+               if (alt != Double.NaN)
+                       sb.append(alt).append(' ');
+               else
+                       sb.append("0 ");
+               sb.append('0');
+       }
+
+       /** singleton */
+       private GeoShapeUtils() {
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GeoToSvg.java b/org.argeo.app.geo/src/org/argeo/app/geo/GeoToSvg.java
new file mode 100644 (file)
index 0000000..abb5b39
--- /dev/null
@@ -0,0 +1,69 @@
+package org.argeo.app.geo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/** Converts a geographical feature to an SVG. */
+public class GeoToSvg {
+       public void convertGeoJsonToSvg(Path source, Path target) {
+               ObjectMapper objectMapper = new ObjectMapper();
+               try (InputStream in = Files.newInputStream(source);
+                               Writer out = Files.newBufferedWriter(target, StandardCharsets.UTF_8)) {
+                       JsonNode tree = objectMapper.readTree(in);
+                       JsonNode coord = tree.get("features").get(0).get("geometry").get("coordinates");
+                       double ratio = 100;
+                       double minX = Double.POSITIVE_INFINITY;
+                       double maxX = Double.NEGATIVE_INFINITY;
+                       double minY = Double.POSITIVE_INFINITY;
+                       double maxY = Double.NEGATIVE_INFINITY;
+                       List<String> shapes = new ArrayList<>();
+                       for (JsonNode shape : coord) {
+                               StringBuffer sb = new StringBuffer();
+                               sb.append("<polyline style=\"stroke-width:0.00000003;stroke:#000000;\" points=\"");
+                               for (JsonNode latlng : shape) {
+                                       double lat = latlng.get(0).asDouble();
+                                       double y = lat * ratio;
+                                       if (y < minY)
+                                               minY = y;
+                                       if (y > maxY)
+                                               maxY = y;
+                                       double lng = latlng.get(1).asDouble();
+                                       double x = lng * ratio;
+                                       if (x < minX)
+                                               minX = x;
+                                       if (x > maxX)
+                                               maxX = x;
+                                       sb.append(y + "," + x + " ");
+                               }
+                               sb.append("\">");
+                               sb.append("</polyline>\n");
+                               shapes.add(sb.toString());
+                       }
+
+                       double width = maxX - minX;
+                       double height = maxY - minY;
+                       out.write("<svg xmlns=\"http://www.w3.org/2000/svg\"\n");
+                       out.write(" width=\"" + (int) (width * 1000) + "\"\n");
+                       out.write(" height=\"" + (int) (height * 1000) + "\"\n");
+                       out.write(" viewBox=\"" + minX + "," + minY + "," + width + "," + height + "\"\n");
+                       out.write(">\n");
+                       for (String shape : shapes) {
+                               out.write(shape);
+                               out.write("\n");
+                       }
+                       out.write("</svg>");
+               } catch (IOException e) {
+                       throw new RuntimeException("Cannot convert " + source + " to " + target, e);
+               }
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GeoTools.java b/org.argeo.app.geo/src/org/argeo/app/geo/GeoTools.java
new file mode 100644 (file)
index 0000000..7571da7
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.app.geo;
+
+import org.argeo.api.cms.CmsLog;
+import org.geotools.api.filter.FilterFactory;
+import org.geotools.api.style.StyleFactory;
+import org.geotools.factory.CommonFactoryFinder;
+
+/**
+ * Factories initialisation and workarounds for the GeoTools library. The idea
+ * is to code defensively around factory initialisation, API changes, and issues
+ * related to running in an OSGi environment. Rather see {@link GeoUtils} for
+ * functional static utilities.
+ */
+public class GeoTools {
+       private final static CmsLog log = CmsLog.getLog(GeoTools.class);
+
+       public final static StyleFactory STYLE_FACTORY;
+       public final static FilterFactory FILTER_FACTORY;
+
+       static {
+               try {
+                       STYLE_FACTORY = CommonFactoryFinder.getStyleFactory();
+                       FILTER_FACTORY = CommonFactoryFinder.getFilterFactory();
+               } catch (RuntimeException e) {
+                       log.error("Basic GeoTools initialisation failed, geographical utilities are probably not available", e);
+                       throw e;
+               }
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GeoToolsTest.java b/org.argeo.app.geo/src/org/argeo/app/geo/GeoToolsTest.java
new file mode 100644 (file)
index 0000000..e6f9c19
--- /dev/null
@@ -0,0 +1,221 @@
+package org.argeo.app.geo;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.geotools.api.data.SimpleFeatureSource;
+import org.geotools.api.data.SimpleFeatureStore;
+import org.geotools.api.data.Transaction;
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.data.DataUtilities;
+import org.geotools.data.DefaultTransaction;
+import org.geotools.data.collection.ListFeatureCollection;
+import org.geotools.data.shapefile.ShapefileDataStore;
+import org.geotools.data.shapefile.ShapefileDataStoreFactory;
+import org.geotools.data.simple.SimpleFeatureCollection;
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+import org.geotools.geometry.jts.JTSFactoryFinder;
+import org.geotools.swing.data.JFileDataStoreChooser;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.Point;
+
+public class GeoToolsTest {
+       public GeoToolsTest() {
+
+       }
+
+       public void init() {
+               try {
+                       main(null);
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public void destroy() {
+
+       }
+
+       public static void main(String[] args) throws Exception {
+               final SimpleFeatureType TYPE = DataUtilities.createType("Location", "the_geom:Point:srid=4326," + // <- the
+               // geometry
+               // attribute:
+               // Point
+               // type
+                               "name:String," + // <- a String attribute
+                               "number:Integer" // a number attribute
+               );
+               final SimpleFeatureType TYPE_HULL = DataUtilities.createType("Hull", "the_geom:MultiPolygon:srid=4326");
+               System.out.println("TYPE:" + TYPE);
+
+               /*
+                * A list to collect features as we create them.
+                */
+               List<SimpleFeature> features = new ArrayList<>();
+               List<Coordinate> coordinates = new ArrayList<>();
+
+               /*
+                * GeometryFactory will be used to create the geometry attribute of each
+                * feature, using a Point object for the location.
+                */
+               GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
+
+               SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
+
+               try (BufferedReader reader = new BufferedReader(
+                               new InputStreamReader(GeoToolsTest.class.getResourceAsStream("/org/djapps/on/apaf/locations.csv")))) {
+                       /* First line of the data file is the header */
+                       String line = reader.readLine();
+                       System.out.println("Header: " + line);
+
+                       for (line = reader.readLine(); line != null; line = reader.readLine()) {
+                               if (line.trim().length() > 0) { // skip blank lines
+                                       String[] tokens = line.split("\\,");
+
+                                       double latitude = Double.parseDouble(tokens[0]);
+                                       double longitude = Double.parseDouble(tokens[1]);
+                                       String name = tokens[2].trim();
+                                       int number = Integer.parseInt(tokens[3].trim());
+
+                                       /* Longitude (= x coord) first ! */
+                                       Coordinate coordinate = new Coordinate(longitude, latitude);
+                                       coordinates.add(coordinate);
+                                       Point point = geometryFactory.createPoint(coordinate);
+
+                                       featureBuilder.add(point);
+                                       featureBuilder.add(name);
+                                       featureBuilder.add(number);
+                                       SimpleFeature feature = featureBuilder.buildFeature(null);
+                                       features.add(feature);
+                               }
+                       }
+               }
+
+               LineString lineString = geometryFactory
+                               .createLineString(coordinates.toArray(new Coordinate[coordinates.size()]));
+               Geometry convexHull = lineString.convexHull();
+               System.out.println(convexHull.toText());
+               SimpleFeatureBuilder hullFeatureBuilder = new SimpleFeatureBuilder(TYPE_HULL);
+               hullFeatureBuilder.add(convexHull);
+               SimpleFeature hull = hullFeatureBuilder.buildFeature(null);
+
+               /*
+                * Get an output file name and create the new shapefile
+                */
+               File newFile = getNewShapeFile();
+
+               ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
+
+               Map<String, Serializable> params = new HashMap<>();
+               params.put("url", newFile.toURI().toURL());
+               params.put("create spatial index", Boolean.TRUE);
+
+               ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
+
+               /*
+                * TYPE is used as a template to describe the file contents
+                */
+               newDataStore.createSchema(TYPE_HULL);
+
+               /*
+                * Write the features to the shapefile
+                */
+               Transaction transaction = new DefaultTransaction("create");
+
+               String typeName = newDataStore.getTypeNames()[0];
+               SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
+               SimpleFeatureType SHAPE_TYPE = featureSource.getSchema();
+               /*
+                * The Shapefile format has a couple limitations: - "the_geom" is always first,
+                * and used for the geometry attribute name - "the_geom" must be of type Point,
+                * MultiPoint, MuiltiLineString, MultiPolygon - Attribute names are limited in
+                * length - Not all data types are supported (example Timestamp represented as
+                * Date)
+                *
+                * Each data store has different limitations so check the resulting
+                * SimpleFeatureType.
+                */
+               System.out.println("SHAPE:" + SHAPE_TYPE);
+
+               if (featureSource instanceof SimpleFeatureStore) {
+                       SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
+                       /*
+                        * SimpleFeatureStore has a method to add features from a
+                        * SimpleFeatureCollection object, so we use the ListFeatureCollection class to
+                        * wrap our list of features.
+                        */
+                       SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, Collections.singletonList(hull));
+                       featureStore.setTransaction(transaction);
+                       try {
+                               featureStore.addFeatures(collection);
+                               transaction.commit();
+                       } catch (Exception problem) {
+                               problem.printStackTrace();
+                               transaction.rollback();
+                       } finally {
+                               transaction.close();
+                       }
+               } else {
+                       System.out.println(typeName + " does not support read/write access");
+               }
+//             if (featureSource instanceof SimpleFeatureStore) {
+//                     SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
+//                     /*
+//                      * SimpleFeatureStore has a method to add features from a
+//                      * SimpleFeatureCollection object, so we use the ListFeatureCollection class to
+//                      * wrap our list of features.
+//                      */
+//                     SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, features);
+//                     featureStore.setTransaction(transaction);
+//                     try {
+//                             featureStore.addFeatures(collection);
+//                             transaction.commit();
+//                     } catch (Exception problem) {
+//                             problem.printStackTrace();
+//                             transaction.rollback();
+//                     } finally {
+//                             transaction.close();
+//                     }
+//             } else {
+//                     System.out.println(typeName + " does not support read/write access");
+//             }
+       }
+
+       /**
+        * Prompt the user for the name and path to use for the output shapefile
+        *
+        * @param csvFile the input csv file used to create a default shapefile name
+        * @return name and path for the shapefile as a new File object
+        */
+       private static File getNewShapeFile() {
+//        String path = csvFile.getAbsolutePath();
+//        String newPath = path.substring(0, path.length() - 4) + ".shp";
+
+               JFileDataStoreChooser chooser = new JFileDataStoreChooser("shp");
+               chooser.setDialogTitle("Save shapefile");
+//        chooser.setSelectedFile(new File(newPath));
+
+               int returnVal = chooser.showSaveDialog(null);
+
+               if (returnVal != JFileDataStoreChooser.APPROVE_OPTION) {
+                       // the user cancelled the dialog
+                       System.exit(0);
+               }
+
+               File newFile = chooser.getSelectedFile();
+
+               return newFile;
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GeoUtils.java b/org.argeo.app.geo/src/org/argeo/app/geo/GeoUtils.java
new file mode 100644 (file)
index 0000000..f134678
--- /dev/null
@@ -0,0 +1,458 @@
+package org.argeo.app.geo;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.Writer;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import javax.measure.Quantity;
+import javax.measure.quantity.Area;
+import javax.xml.transform.TransformerException;
+
+import org.geotools.api.data.SimpleFeatureSource;
+import org.geotools.api.data.SimpleFeatureStore;
+import org.geotools.api.data.Transaction;
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.api.filter.Filter;
+import org.geotools.api.filter.FilterFactory;
+import org.geotools.api.filter.expression.Expression;
+import org.geotools.api.geometry.MismatchedDimensionException;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.TransformException;
+import org.geotools.api.style.AnchorPoint;
+import org.geotools.api.style.Displacement;
+import org.geotools.api.style.FeatureTypeConstraint;
+import org.geotools.api.style.FeatureTypeStyle;
+import org.geotools.api.style.Fill;
+import org.geotools.api.style.Graphic;
+import org.geotools.api.style.GraphicalSymbol;
+import org.geotools.api.style.NamedLayer;
+import org.geotools.api.style.PointSymbolizer;
+import org.geotools.api.style.Rule;
+import org.geotools.api.style.Stroke;
+import org.geotools.api.style.Style;
+import org.geotools.api.style.StyleFactory;
+import org.geotools.api.style.StyledLayerDescriptor;
+import org.geotools.api.style.UserLayer;
+import org.geotools.data.DefaultTransaction;
+import org.geotools.data.collection.ListFeatureCollection;
+import org.geotools.data.shapefile.ShapefileDataStore;
+import org.geotools.data.shapefile.ShapefileDataStoreFactory;
+import org.geotools.data.simple.SimpleFeatureCollection;
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.geometry.jts.JTS;
+import org.geotools.referencing.CRS;
+import org.geotools.referencing.crs.DefaultGeographicCRS;
+import org.geotools.styling.css.CssParser;
+import org.geotools.styling.css.CssTranslator;
+import org.geotools.styling.css.Stylesheet;
+import org.geotools.xml.styling.SLDTransformer;
+import org.locationtech.jts.algorithm.hull.ConcaveHull;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.Point;
+import org.locationtech.jts.geom.Polygon;
+import org.locationtech.jts.geom.util.GeometryFixer;
+import org.locationtech.jts.operation.polygonize.Polygonizer;
+
+import si.uom.SI;
+import tech.units.indriya.quantity.Quantities;
+
+/** Utilities around geographical format, mostly wrapping GeoTools patterns. */
+public class GeoUtils {
+       public final static String EPSG_4326 = "EPSG:4326";
+
+       /** In square meters. */
+       public static Quantity<Area> calcArea(SimpleFeature feature) {
+               try {
+                       Polygon polygon = (Polygon) feature.getDefaultGeometry();
+                       Point centroid = polygon.getCentroid();
+//                     CoordinateReferenceSystem crs = feature.getDefaultGeometryProperty().getType()
+//                                     .getCoordinateReferenceSystem();
+                       // TODO convert the centroid
+//                     if (!crs.getName().equals(DefaultGeographicCRS.WGS84.getName()))
+//                             throw new IllegalArgumentException("Only WGS84 CRS is currently supported");
+
+                       // create automatic CRS for optimal computation
+                       String code = "AUTO:42001," + centroid.getX() + "," + centroid.getY();
+                       CoordinateReferenceSystem auto = CRS.decode(code);
+
+                       MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
+
+                       Polygon projed = (Polygon) JTS.transform(polygon, transform);
+                       return Quantities.getQuantity(projed.getArea(), SI.SQUARE_METRE);
+               } catch (MismatchedDimensionException | FactoryException | TransformException e) {
+                       throw new IllegalStateException("Cannot calculate area of feature", e);
+               }
+       }
+
+       /** In square meters. The {@link Polygon} must use WGS84 coordinates. */
+       public static Quantity<Area> calcArea(Polygon polygon) {
+               assert polygon.getSRID() == 0 || polygon.getSRID() == 4326;
+               return calcArea(polygon, DefaultGeographicCRS.WGS84, polygon.getCentroid());
+       }
+
+       public static Quantity<Area> calcArea(Polygon polygon, CoordinateReferenceSystem crs, Point wgs84centroid) {
+               try {
+                       // create automatic CRS for optimal computation
+                       String code = "AUTO:42001," + wgs84centroid.getX() + "," + wgs84centroid.getY();
+                       CoordinateReferenceSystem auto = CRS.decode(code);
+
+                       MathTransform transform = CRS.findMathTransform(crs, auto);
+
+                       Polygon projed = (Polygon) JTS.transform(polygon, transform);
+                       return Quantities.getQuantity(projed.getArea(), SI.SQUARE_METRE);
+               } catch (MismatchedDimensionException | FactoryException | TransformException e) {
+                       throw new IllegalStateException("Cannot calculate area of feature", e);
+               }
+       }
+
+       public static void exportToSvg(Geometry[] geometries, Writer out, int width, int height) {
+               try {
+                       double minY = Double.POSITIVE_INFINITY;
+                       double maxY = Double.NEGATIVE_INFINITY;
+                       double minX = Double.POSITIVE_INFINITY;
+                       double maxX = Double.NEGATIVE_INFINITY;
+                       List<String> shapes = new ArrayList<>();
+                       for (Geometry geometry : geometries) {
+                               StringBuffer sb = new StringBuffer();
+                               sb.append("<polyline style=\"stroke-width:1;stroke:#000000;fill:none;\" points=\"");
+
+                               if (geometry instanceof Polygon p) {
+                                       Point centroid = p.getCentroid();
+                                       String code = "AUTO:42001," + centroid.getX() + "," + centroid.getY();
+                                       CoordinateReferenceSystem auto = CRS.decode(code);
+
+                                       MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
+
+                                       Polygon projed = (Polygon) JTS.transform(p, transform);
+
+                                       // EPSG4326 are in lat/lon order, so we invert coordinates
+                                       for (Coordinate coord : projed.getCoordinates()) {
+                                               double x = coord.y;
+                                               if (x < minX)
+                                                       minX = x;
+                                               if (x > maxX)
+                                                       maxX = x;
+                                               double y = -coord.x;
+                                               if (y < minY)
+                                                       minY = y;
+                                               if (y > maxY)
+                                                       maxY = y;
+                                               sb.append(x + "," + y + " ");
+                                       }
+                                       sb.append("\">");
+                                       sb.append("</polyline>\n");
+                                       shapes.add(sb.toString());
+                               } else {
+                                       throw new IllegalArgumentException("Unsuppported geometry type " + geometry.getClass().getName());
+                               }
+                       }
+                       double viewportHeight = maxY - minY;
+                       double viewportWidth = maxX - minX;
+                       out.write("<svg xmlns=\"http://www.w3.org/2000/svg\"\n");
+                       out.write(" width=\"" + width + "\"\n");
+                       out.write(" height=\"" + height + "\"\n");
+                       out.write(" viewBox=\"" + minX + " " + minY + " " + viewportWidth + " " + viewportHeight + "\"\n");
+                       out.write(" preserveAspectRatio=\"xMidYMid meet\"\n");
+                       out.write(">\n");
+                       for (String shape : shapes) {
+                               out.write(shape);
+                               out.write("\n");
+                       }
+                       out.write("</svg>");
+               } catch (IOException | FactoryException | MismatchedDimensionException | TransformException e) {
+                       throw new RuntimeException("Cannot export to SVG", e);
+               }
+       }
+
+       /** Write a list of simple features to a shapefile. */
+       public static void saveFeaturesAsShapefile(SimpleFeatureType featureType, List<SimpleFeature> features,
+                       Path shpFile) {
+               try {
+                       ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
+
+                       Map<String, Serializable> params = new HashMap<>();
+                       params.put("url", shpFile.toUri().toURL());
+
+                       params.put("create spatial index", Boolean.TRUE);
+
+                       ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
+                       newDataStore.createSchema(featureType);
+
+                       String typeName = newDataStore.getTypeNames()[0];
+                       SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
+                       if (featureSource instanceof SimpleFeatureStore) {
+                               SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
+                               SimpleFeatureCollection collection = new ListFeatureCollection(featureType, features);
+
+                               try (Transaction transaction = new DefaultTransaction("create")) {
+                                       try {
+                                               featureStore.setTransaction(transaction);
+                                               featureStore.addFeatures(collection);
+                                               transaction.commit();
+                                       } catch (Exception problem) {
+                                               transaction.rollback();
+                                               throw new RuntimeException("Cannot write shapefile " + shpFile, problem);
+                                       }
+                               }
+                       } else {
+                               throw new IllegalArgumentException(typeName + " does not support read/write access");
+                       }
+               } catch (IOException e) {
+                       throw new RuntimeException("Cannot write shapefile " + shpFile, e);
+               }
+       }
+
+       /*
+        * STYLING
+        */
+
+       public static Style createStyleFromCss(String css) {
+               Stylesheet ss = CssParser.parse(css);
+               CssTranslator translator = new CssTranslator();
+               Style style = translator.translate(ss);
+
+//             try {
+//                     SLDTransformer styleTransform = new SLDTransformer();
+//                     String xml = styleTransform.transform(style);
+//                     System.out.println(xml);
+//             } catch (TransformerException e) {
+//                     // TODO Auto-generated catch block
+//                     e.printStackTrace();
+//             }
+
+               return (Style) style;
+       }
+
+       public static String createSldFromCss(String name, String title, String css) {
+               StyledLayerDescriptor sld = GeoTools.STYLE_FACTORY.createStyledLayerDescriptor();
+               sld.setName(name);
+               sld.setTitle(title);
+
+               NamedLayer layer = GeoTools.STYLE_FACTORY.createNamedLayer();
+               layer.setName(name);
+
+               Style style = createStyleFromCss(css);
+               layer.styles().add(style);
+
+               sld.layers().add(layer);
+               return sldToXml(sld);
+       }
+
+       public static String sldToXml(StyledLayerDescriptor sld) {
+               try {
+                       SLDTransformer styleTransform = new SLDTransformer();
+                       String xml = styleTransform.transform(sld);
+//                     System.out.println(xml);
+                       return xml;
+               } catch (TransformerException e) {
+                       throw new IllegalStateException("Cannot write SLD as XML", e);
+               }
+       }
+
+       public static void main(String... args) {
+               String css = """
+                               * {
+                                  mark: symbol(circle);
+                                  mark-size: 6px;
+                                }
+
+                                :mark {
+                                  fill: red;
+                                }
+
+                                                               """;
+               createSldFromCss("test", "Test", css);
+       }
+
+       public static String createTestSLD() {
+
+               StyleFactory sf = CommonFactoryFinder.getStyleFactory();
+               FilterFactory ff = CommonFactoryFinder.getFilterFactory();
+
+               StyledLayerDescriptor sld = sf.createStyledLayerDescriptor();
+               sld.setName("sld");
+               sld.setTitle("Example");
+               sld.setAbstract("Example Style Layer Descriptor");
+
+               UserLayer layer = sf.createUserLayer();
+               layer.setName("layer");
+
+               //
+               // define constraint limited what features the sld applies to
+               FeatureTypeConstraint constraint = sf.createFeatureTypeConstraint("Feature", Filter.INCLUDE);
+
+               layer.layerFeatureConstraints().add(constraint);
+
+               //
+               // create a "user defined" style
+               Style style = sf.createStyle();
+               style.setName("style");
+               style.getDescription().setTitle("User Style");
+               style.getDescription().setAbstract("Definition of Style");
+
+               //
+               // define feature type styles used to actually define how features are rendered
+               FeatureTypeStyle featureTypeStyle = sf.createFeatureTypeStyle();
+
+               // RULE 1
+               // first rule to draw cities
+               Rule rule1 = sf.createRule();
+               rule1.setName("rule1");
+               rule1.getDescription().setTitle("City");
+               rule1.getDescription().setAbstract("Rule for drawing cities");
+//             rule1.setFilter(ff.less(ff.property("POPULATION"), ff.literal(50000)));
+
+               //
+               // create the graphical mark used to represent a city
+               Stroke stroke = sf.stroke(ff.literal("#000000"), null, null, null, null, null, null);
+               Fill fill = sf.fill(null, ff.literal(java.awt.Color.BLUE), ff.literal(1.0));
+
+//        // OnLineResource implemented by gt-metadata - so no factory!
+//        OnLineResourceImpl svg = new OnLineResourceImpl(new URI("file:city.svg"));
+//        svg.freeze(); // freeze to prevent modification at runtime
+//
+//        OnLineResourceImpl png = new OnLineResourceImpl(new URI("file:city.png"));
+//        png.freeze(); // freeze to prevent modification at runtime
+
+               //
+               // List of symbols is considered in order with the rendering engine choosing
+               // the first one it can handle. Allowing for svg, png, mark order
+               List<GraphicalSymbol> symbols = new ArrayList<>();
+//        symbols.add(sf.externalGraphic(svg, "svg", null)); // svg preferred
+//        symbols.add(sf.externalGraphic(png, "png", null)); // png preferred
+               symbols.add(sf.mark(ff.literal("circle"), fill, stroke)); // simple circle backup plan
+
+               Expression opacity = null; // use default
+               Expression size = ff.literal(10);
+               Expression rotation = null; // use default
+               AnchorPoint anchor = null; // use default
+               Displacement displacement = null; // use default
+
+               // define a point symbolizer of a small circle
+               Graphic city = sf.graphic(symbols, opacity, size, rotation, anchor, displacement);
+               PointSymbolizer pointSymbolizer = sf.pointSymbolizer("point", ff.property("the_geom"), null, null, city);
+
+               rule1.symbolizers().add(pointSymbolizer);
+
+               featureTypeStyle.rules().add(rule1);
+
+               //
+               // RULE 2 Default
+
+//             List<GraphicalSymbol> dotSymbols = new ArrayList<>();
+//             dotSymbols.add(sf.mark(ff.literal("circle"), null, null));
+//             Graphic dotGraphic = sf.graphic(dotSymbols, null, ff.literal(3), null, null, null);
+//             PointSymbolizer dotSymbolizer = sf.pointSymbolizer("dot", ff.property("the_geom"), null, null, dotGraphic);
+//             List<org.opengis.style.Symbolizer> symbolizers = new ArrayList<>();
+//             symbolizers.add(dotSymbolizer);
+//             Filter other = null; // null will mark this rule as "other" accepting all remaining features
+//             Rule rule2 = sf.rule("default", null, null, Double.MIN_VALUE, Double.MAX_VALUE, symbolizers, other);
+//             featureTypeStyle.rules().add(rule2);
+
+               style.featureTypeStyles().add(featureTypeStyle);
+
+               layer.userStyles().add(style);
+
+               sld.layers().add(layer);
+
+               try {
+                       SLDTransformer styleTransform = new SLDTransformer();
+                       String xml = styleTransform.transform(sld);
+                       System.out.println(xml);
+                       return xml;
+               } catch (TransformerException e) {
+                       throw new IllegalStateException(e);
+               }
+
+       }
+
+       public static long getScaleFromResolution(long resolution) {
+               // see
+               // https://gis.stackexchange.com/questions/242424/how-to-get-map-units-to-find-current-scale-in-openlayers
+               final double INCHES_PER_UNIT = 39.37;// m
+               // final double INCHES_PER_UNIT = 4374754;// dd
+               final long DOTS_PER_INCH = 72;
+               return Math.round(INCHES_PER_UNIT * DOTS_PER_INCH * resolution);
+       }
+
+       /*
+        * GEOMETRY
+        */
+       /**
+        * Ensure that a {@link Polygon} is valid and simple by removing artefacts
+        * (typically coming from GPS).
+        * 
+        * @return a simple and valid polygon, or null if the ignoredArea ratio is above
+        *         the provided threshold.
+        */
+       public static Polygon cleanPolygon(Polygon polygon, double ignoredAreaRatio) {
+               Polygonizer polygonizer = new Polygonizer(true);
+               Geometry fixed = GeometryFixer.fix(polygon, false);
+               polygonizer.add(fixed);
+               @SuppressWarnings("unchecked")
+               List<Polygon> polygons = new ArrayList<>(polygonizer.getPolygons());
+
+               if (polygons.size() == 0) {
+                       throw new IllegalStateException("Polygonizer failed to extract any polygon");
+               }
+
+               Polygon best;
+               if (polygons.size() == 1) {
+                       best = polygons.get(0);
+               } else {
+                       double totalArea = fixed.getArea();
+                       best = polygons.get(0);
+                       double bestArea = best.getArea();
+                       for (int i = 1; i < polygons.size(); i++) {
+                               Polygon p = polygons.get(i);
+                               double a = p.getArea();
+                               if (a > bestArea) {
+                                       best = p;
+                                       bestArea = a;
+                               } else {
+                                       // double ratio = a / totalArea;
+                               }
+                       }
+                       double ignoredRatio = (totalArea - bestArea) / totalArea;
+                       if (ignoredRatio > ignoredAreaRatio)
+                               return null;
+
+                       if (!best.isValid() || !best.isSimple()) {
+                               throw new IllegalStateException("The polygon is not simple and/or valid after cleaning");
+                       }
+               }
+               // while we are here, we make sure that the geometry will be normalised
+               best.normalize();
+               return best;
+       }
+
+       /**
+        * The smallest polygon without holes containing all the points in this
+        * geometry.
+        */
+       public static Polygon concaveHull(Geometry geom, double lengthRatio) {
+               Objects.requireNonNull(geom);
+               if (geom.getNumPoints() < 3)
+                       throw new IllegalArgumentException("At least 3 points are reuired to compute the concave hull and geometry "
+                                       + geom.getClass() + " contains only " + geom.getNumPoints());
+               Geometry hull = ConcaveHull.concaveHullByLengthRatio(geom, lengthRatio, false);
+               if (hull instanceof Polygon polygon)
+                       return polygon;
+               else
+                       throw new IllegalStateException("Hull is not a polygon but a " + hull.getClass());
+       }
+
+       /** Singleton. */
+       private GeoUtils() {
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GmlAttr.java b/org.argeo.app.geo/src/org/argeo/app/geo/GmlAttr.java
new file mode 100644 (file)
index 0000000..77b0885
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.app.geo;
+
+import org.argeo.api.acr.QNamed;
+
+public enum GmlAttr implements QNamed {
+       uom
+       //
+       ;
+
+       public final static String UOM_SQUARE_METERS = "m2";
+
+       @Override
+       public String getNamespace() {
+               return "http://www.opengis.net/gml/3.2";
+       }
+
+       @Override
+       public String getDefaultPrefix() {
+               return "gml";
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GmlType.java b/org.argeo.app.geo/src/org/argeo/app/geo/GmlType.java
new file mode 100644 (file)
index 0000000..980a5e4
--- /dev/null
@@ -0,0 +1,20 @@
+package org.argeo.app.geo;
+
+import org.argeo.api.acr.QNamed;
+
+public enum GmlType implements QNamed {
+       measure
+       //
+       ;
+
+       @Override
+       public String getNamespace() {
+               return "http://www.opengis.net/gml/3.2";
+       }
+
+       @Override
+       public String getDefaultPrefix() {
+               return "gml";
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/GpxUtils.java b/org.argeo.app.geo/src/org/argeo/app/geo/GpxUtils.java
new file mode 100644 (file)
index 0000000..44afa2c
--- /dev/null
@@ -0,0 +1,151 @@
+package org.argeo.app.geo;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringTokenizer;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.geotools.api.feature.simple.SimpleFeature;
+import org.geotools.api.feature.simple.SimpleFeatureType;
+import org.geotools.data.DataUtilities;
+import org.geotools.feature.SchemaException;
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.MultiPoint;
+import org.locationtech.jts.geom.Polygon;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/** Utilities around the GPX format. */
+public class GpxUtils {
+       /** GPX as a LineString in WGS84 (feature type with only the_geom). */
+       public static final SimpleFeatureType LINESTRING_FEATURE_TYPE;
+       /** GPX as a Polygon in WGS84 (feature type with only the_geom). */
+       public static final SimpleFeatureType POLYGON_FEATURE_TYPE;
+
+       static {
+               try {
+                       LINESTRING_FEATURE_TYPE = DataUtilities.createType("Area", "the_geom:LineString:srid=4326");
+                       POLYGON_FEATURE_TYPE = DataUtilities.createType("Area", "the_geom:Polygon:srid=4326");
+               } catch (SchemaException e) {
+                       throw new RuntimeException("Cannot create GPX Feature type", e);
+               }
+       }
+
+       /**
+        * Converts a GPX track to either a {@link Geometry} with WGS84 coordinates
+        * ({@link LineString} or {@link Polygon}) or a {@link SimpleFeature} (with
+        * {@link #LINESTRING_FEATURE_TYPE}).
+        */
+       @SuppressWarnings("unchecked")
+       public static <T> T parseGpxTrackTo(InputStream in, Class<T> clss) throws IOException {
+               GeometryFactory geometryFactory = JTS.GEOMETRY_FACTORY_WGS84;
+               List<Coordinate> coordinates = new ArrayList<>();
+               try {
+                       SAXParserFactory factory = SAXParserFactory.newInstance();
+                       SAXParser saxParser = factory.newSAXParser();
+
+                       saxParser.parse(in, new DefaultHandler() {
+
+                               @Override
+                               public void startElement(String uri, String localName, String qName, Attributes attributes)
+                                               throws SAXException {
+                                       if ("trkpt".equals(qName)) {
+                                               Double latitude = Double.parseDouble(attributes.getValue("lat"));
+                                               Double longitude = Double.parseDouble(attributes.getValue("lon"));
+                                               // TODO elevation in 3D context
+                                               Coordinate coordinate = new Coordinate(latitude, longitude);
+                                               coordinates.add(coordinate);
+                                       }
+                               }
+
+                       });
+               } catch (ParserConfigurationException | SAXException e) {
+                       throw new RuntimeException("Cannot convert GPX", e);
+               }
+
+               if (LineString.class.isAssignableFrom(clss)) {
+                       LineString lineString = geometryFactory
+                                       .createLineString(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       return (T) lineString;
+               } else if (MultiPoint.class.isAssignableFrom(clss)) {
+                       MultiPoint multiPoint = geometryFactory
+                                       .createMultiPointFromCoords(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       // multiPoint.normalize();
+                       return (T) multiPoint;
+               } else if (Polygon.class.isAssignableFrom(clss)) {
+                       Coordinate first = coordinates.get(0);
+                       Coordinate last = coordinates.get(coordinates.size() - 1);
+                       if (!(first.getX() == last.getX() && first.getY() == last.getY())) {
+                               // close the line string
+                               coordinates.add(first);
+                       }
+                       Polygon polygon = geometryFactory.createPolygon(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       return (T) polygon;
+               } else if (SimpleFeature.class.isAssignableFrom(clss)) {
+                       SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(LINESTRING_FEATURE_TYPE);
+                       LineString lineString = geometryFactory
+                                       .createLineString(coordinates.toArray(new Coordinate[coordinates.size()]));
+                       featureBuilder.add(lineString);
+                       SimpleFeature area = featureBuilder.buildFeature(null);
+                       return (T) area;
+               } else {
+                       throw new IllegalArgumentException("Unsupported format " + clss);
+               }
+       }
+
+       /** @deprecated Use {@link #parseGpxTrackTo(InputStream, Class)} instead. */
+       @Deprecated
+       public static SimpleFeature parseGpxToPolygon(InputStream in) throws IOException {
+               SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(POLYGON_FEATURE_TYPE);
+               Polygon polygon = parseGpxTrackTo(in, Polygon.class);
+               featureBuilder.add(polygon);
+               SimpleFeature area = featureBuilder.buildFeature(null);
+               return area;
+       }
+
+       /** Write ODK GeoShape as a GPX file. */
+       public static void writeGeoShapeAsGpx(String geoShape, OutputStream out) throws IOException {
+               Objects.requireNonNull(geoShape);
+               Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
+               writer.append("<gpx><trk><trkseg>");
+               StringTokenizer stSeg = new StringTokenizer(geoShape.trim(), ";");
+               while (stSeg.hasMoreTokens()) {
+                       StringTokenizer stPt = new StringTokenizer(stSeg.nextToken().trim(), " ");
+                       String lat = stPt.nextToken();
+                       String lng = stPt.nextToken();
+                       String alt = stPt.nextToken();
+                       // String precision = stPt.nextToken();
+                       writer.append("<trkpt");
+                       writer.append(" lat=\"").append(lat).append('\"');
+                       writer.append(" lon=\"").append(lng).append('\"');
+                       if (!alt.equals("0.0")) {
+                               writer.append('>');
+                               writer.append("<ele>").append(alt).append("</ele>");
+                               writer.append("</trkpt>");
+                       } else {
+                               writer.append("/>");
+                       }
+               }
+               writer.append("</trkseg></trk></gpx>");
+               writer.flush();
+       }
+
+       /** Singleton. */
+       private GpxUtils() {
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/JTS.java b/org.argeo.app.geo/src/org/argeo/app/geo/JTS.java
new file mode 100644 (file)
index 0000000..ba7ecf9
--- /dev/null
@@ -0,0 +1,33 @@
+package org.argeo.app.geo;
+
+import org.argeo.api.cms.CmsLog;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.PrecisionModel;
+
+/**
+ * Factories initialisation and workarounds for the JTS library. The idea is to
+ * code defensively around factory initialisation, API changes, and issues
+ * related to running in an OSGi environment. Rather see {@link GeoUtils} for
+ * functional static utilities.
+ */
+public class JTS {
+       private final static CmsLog log = CmsLog.getLog(JTS.class);
+
+       public final static int WGS84_SRID = 4326;
+
+       /** A geometry factory with no SRID specified */
+       public final static GeometryFactory GEOMETRY_FACTORY;
+       /** A geometry factory with SRID 4326 (WGS84 in the EPSG database) */
+       public final static GeometryFactory GEOMETRY_FACTORY_WGS84;
+
+       static {
+               try {
+                       GEOMETRY_FACTORY = new GeometryFactory();
+                       GEOMETRY_FACTORY_WGS84 = new GeometryFactory(new PrecisionModel(), WGS84_SRID);
+               } catch (RuntimeException e) {
+                       log.error("Basic JTS initialisation failed, geographical utilities are probably not available", e);
+                       throw e;
+               }
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/acr/AbstractFeatureAdapter.java b/org.argeo.app.geo/src/org/argeo/app/geo/acr/AbstractFeatureAdapter.java
new file mode 100644 (file)
index 0000000..95e8216
--- /dev/null
@@ -0,0 +1,34 @@
+package org.argeo.app.geo.acr;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.geo.FeatureAdapter;
+import org.locationtech.jts.geom.Geometry;
+
+public abstract class AbstractFeatureAdapter implements FeatureAdapter {
+       @Override
+       public Geometry getDefaultGeometry(Content c, QName targetFeature) {
+               // TODO deal with more defaults
+               // TODO deal with target feature
+               if (c.hasContentClass(EntityType.geopoint)) {
+                       return getGeoPointGeometry(c);
+               }
+               return null;
+       }
+
+       protected Geometry getGeoPointGeometry(Content c) {
+               if (c.hasContentClass(EntityType.geopoint)) {
+                       return GeoEntityUtils.toPoint(c);
+//                     double latitude = c.get(WGS84PosName.lat, Double.class).get();
+//                     double longitude = c.get(WGS84PosName.lon, Double.class).get();
+//
+//                     Coordinate coordinate = new Coordinate(longitude, latitude);
+//                     Point the_geom = JTS.GEOMETRY_FACTORY.createPoint(coordinate);
+//                     return the_geom;
+               }
+               return null;
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/acr/GeoEntityUtils.java b/org.argeo.app.geo/src/org/argeo/app/geo/acr/GeoEntityUtils.java
new file mode 100644 (file)
index 0000000..2fd0ad1
--- /dev/null
@@ -0,0 +1,175 @@
+package org.argeo.app.geo.acr;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.UncheckedIOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentName;
+import org.argeo.api.acr.DName;
+import org.argeo.api.acr.QNamed;
+import org.argeo.api.app.EntityName;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.WGS84PosName;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.geo.GeoJson;
+import org.argeo.app.geo.JTS;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Envelope;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.GeometryCollection;
+import org.locationtech.jts.geom.Point;
+
+import jakarta.json.Json;
+import jakarta.json.JsonObject;
+import jakarta.json.JsonReader;
+import jakarta.json.stream.JsonGenerator;
+import jakarta.json.stream.JsonParsingException;
+
+/** Utilities around entity types related to geography. */
+public class GeoEntityUtils {
+       private final static CmsLog log = CmsLog.getLog(GeoEntityUtils.class);
+
+       public static final String _GEOM_JSON = ".geom.json";
+
+       public static void putGeometry(Content c, QNamed name, Geometry geometry) {
+               putGeometry(c, name.qName(), geometry);
+       }
+
+       public static void putGeometry(Content c, QName name, Geometry geometry) {
+               QName jsonFileName = getJsonFileName(name);
+               Content geom = c.soleChild(jsonFileName).orElseGet(
+                               () -> c.add(jsonFileName, Collections.singletonMap(DName.getcontenttype.qName(), "application/json")));
+               try (OutputStream out = geom.open(OutputStream.class)) {
+                       JsonGenerator g = Json.createGenerator(out);
+                       g.writeStartObject();
+                       GeoJson.writeGeometry(g, geometry);
+                       g.writeEnd();
+                       g.close();
+               } catch (IOException e) {
+                       throw new UncheckedIOException("Cannot add geometry " + name + " to " + c, e);
+               }
+
+//             try (BufferedReader in = new BufferedReader(
+//                             new InputStreamReader(geom.open(InputStream.class), StandardCharsets.UTF_8))) {
+//                     System.out.println(in.readLine());
+//             } catch (IOException e) {
+//                     throw new UncheckedIOException("Cannot parse " + c, e);
+//             }
+               updateBoundingBox(c);
+       }
+
+       public static boolean hasGeometry(Content c, QNamed name) {
+               return hasGeometry(c, name.qName());
+       }
+
+       public static boolean hasGeometry(Content c, QName name) {
+               QName jsonFileName = getJsonFileName(name);
+               return c.hasChild(jsonFileName);
+       }
+
+       public static <T extends Geometry> T getGeometry(Content c, QNamed name, Class<T> clss) {
+               return getGeometry(c, name.qName(), clss);
+       }
+
+       public static <T extends Geometry> T getGeometry(Content c, QName name, Class<T> clss) {
+               QName jsonFileName = getJsonFileName(name);
+               Content geom = c.soleChild(jsonFileName).orElse(null);
+               if (geom == null)
+                       return null;
+//             try (Reader in = new InputStreamReader(geom.open(InputStream.class), StandardCharsets.UTF_8)) {
+//                     String json = StreamUtils.toString(new BufferedReader(in));
+//                     System.out.println("JSON:\n" + json);
+//             } catch (IOException e1) {
+//                     // TODO Auto-generated catch block
+//                     e1.printStackTrace();
+//             }
+               try (Reader in = new InputStreamReader(geom.open(InputStream.class), StandardCharsets.UTF_8)) {
+                       JsonReader jsonReader = Json.createReader(in);
+                       JsonObject jsonObject = jsonReader.readObject();
+                       T readGeom = GeoJson.readGeometry(jsonObject, clss);
+                       return readGeom;
+               } catch (IOException e) {
+                       throw new UncheckedIOException("Cannot parse " + c, e);
+               } catch (JsonParsingException e) {
+                       if (log.isTraceEnabled())
+                               log.warn("Invalid GeoJson for " + geom);
+                       // json is invalid, returning null
+                       return null;
+               }
+       }
+
+       private static QName getJsonFileName(QName name) {
+               QName jsonFileName = new ContentName(name.getNamespaceURI(), name.getLocalPart() + _GEOM_JSON);
+               return jsonFileName;
+       }
+
+       public static Point toPoint(Content c) {
+               if (c.containsKey(WGS84PosName.lon) && c.containsKey(WGS84PosName.lat)) {
+                       Double lat = c.get(WGS84PosName.lat, Double.class).orElseThrow();
+                       Double lon = c.get(WGS84PosName.lon, Double.class).orElseThrow();
+                       return JTS.GEOMETRY_FACTORY_WGS84.createPoint(new Coordinate(lat, lon));
+//                     Double alt = c.get(WGS84PosName.alt, Double.class).orElse(null);
+//                     return JTS.GEOMETRY_FACTORY_WGS84
+//                                     .createPoint(alt != null ? new Coordinate(lat, lon, alt) : new Coordinate(lat, lon));
+               }
+               return null;
+       }
+
+       public static GeometryCollection getGeometries(Content entity) {
+               List<Geometry> geoms = new ArrayList<>();
+               Point geoPoint = toPoint(entity);
+               if (geoPoint != null)
+                       geoms.add(geoPoint);
+
+               Geometry place = getGeometry(entity, EntityName.place.qName(), Geometry.class);
+               if (place != null)
+                       geoms.add(place);
+
+               if (geoms.isEmpty())
+                       return null;
+               GeometryCollection geometryCollection = JTS.GEOMETRY_FACTORY_WGS84
+                               .createGeometryCollection(geoms.toArray(new Geometry[geoms.size()]));
+               return geometryCollection;
+       }
+
+       public static void updateBoundingBox(Content entity) {
+               GeometryCollection geometryCollection = getGeometries(entity);
+               if (geometryCollection == null)
+                       return;
+               entity.addContentClasses(EntityType.geobounded.qName());
+
+               Envelope bbox = geometryCollection.getEnvelopeInternal();
+               entity.put(EntityName.minLat, bbox.getMinX());
+               entity.put(EntityName.minLon, bbox.getMinY());
+               entity.put(EntityName.maxLat, bbox.getMaxX());
+               entity.put(EntityName.maxLon, bbox.getMaxY());
+       }
+
+       public static void updateBoundingBox(Content entity, QName prop) {
+               Geometry geom = getGeometry(entity, prop, Geometry.class);
+               if (geom == null)
+                       return;
+               entity.addContentClasses(EntityType.geobounded.qName());
+
+               Envelope bbox = geom.getEnvelopeInternal();
+               entity.put(EntityName.minLat, bbox.getMinX());
+               entity.put(EntityName.minLon, bbox.getMinY());
+               entity.put(EntityName.maxLat, bbox.getMaxX());
+               entity.put(EntityName.maxLon, bbox.getMaxY());
+       }
+
+       /** singleton */
+       private GeoEntityUtils() {
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/geonames/GeonamesAdm.java b/org.argeo.app.geo/src/org/argeo/app/geo/geonames/GeonamesAdm.java
new file mode 100644 (file)
index 0000000..45febd2
--- /dev/null
@@ -0,0 +1,157 @@
+package org.argeo.app.geo.geonames;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+/** A Geonames administrative subdivision. */
+public class GeonamesAdm {
+       private final Long geonameId;
+       private final String countryCode;
+       private final String adminCode1;
+       private final String admLevel;
+       private final Integer level;
+       private final String name;
+       private final String asciiName;
+       private final List<String> alternateNames;
+       private final Double lat;
+       private final Double lng;
+       private final LocalDate lastUpdated;
+       private final ZoneId timeZone;
+
+       private final Long[] upperLevelIds = new Long[5];
+       private final List<GeonamesAdm> upperLevels = new ArrayList<>();
+
+       private List<String> row;
+
+       /** Initialise from a row in the main Geonames table. */
+       public GeonamesAdm(List<String> row) {
+               geonameId = Long.parseLong(row.get(0));
+               admLevel = row.get(7);
+               countryCode = row.get(8);
+               adminCode1 = row.get(10);
+               if (admLevel.startsWith("ADM")) {
+                       if (admLevel.endsWith("H"))
+                               level = Integer.parseInt(admLevel.substring(3, admLevel.length() - 1));
+                       else
+                               level = Integer.parseInt(admLevel.substring(3));
+               } else if (admLevel.equals("PCLI")) {
+                       level = 0;
+               } else {
+                       throw new IllegalArgumentException("Unsupported admin level " + admLevel);
+               }
+               name = row.get(1);
+               asciiName = row.get(2);
+               alternateNames = Arrays.asList(row.get(3).split(","));
+               lat = Double.parseDouble(row.get(4));
+               lng = Double.parseDouble(row.get(5));
+               lastUpdated = LocalDate.parse(row.get(18));
+               timeZone = ZoneId.of(row.get(17));
+               // upper levels
+               if (row.get(11) != null && !row.get(11).trim().equals(""))
+                       upperLevelIds[2] = Long.parseLong(row.get(11));
+               if (row.get(12) != null && !row.get(12).trim().equals(""))
+                       upperLevelIds[3] = Long.parseLong(row.get(12));
+               if (row.get(13) != null && !row.get(13).trim().equals(""))
+                       upperLevelIds[4] = Long.parseLong(row.get(13));
+               this.row = row;
+       }
+
+       public void mapUpperLevels(Map<Long, GeonamesAdm> index) {
+               for (int i = 0; i < level; i++) {
+                       Long geonameId = upperLevelIds[i];
+                       upperLevels.add(i, index.get(geonameId));
+               }
+       }
+
+       public Long getGeonameId() {
+               return geonameId;
+       }
+
+       public Integer getLevel() {
+               return level;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public String getName(Function<String, String> transform) {
+               if (transform != null)
+                       return transform.apply(name);
+               else
+                       return name;
+
+       }
+
+       public String getAsciiName() {
+               return asciiName;
+       }
+
+       public List<String> getAlternateNames() {
+               return alternateNames;
+       }
+
+       public Double getLat() {
+               return lat;
+       }
+
+       public Double getLng() {
+               return lng;
+       }
+
+       public String getCountryCode() {
+               return countryCode;
+       }
+
+       public String getAdmLevel() {
+               return admLevel;
+       }
+
+       public List<String> getRow() {
+               return row;
+       }
+
+       public LocalDate getLastUpdated() {
+               return lastUpdated;
+       }
+
+       public ZoneId getTimeZone() {
+               return timeZone;
+       }
+
+       public String getAdminCode1() {
+               return adminCode1;
+       }
+
+       public Long[] getUpperLevelIds() {
+               return upperLevelIds;
+       }
+
+       public List<GeonamesAdm> getUpperLevels() {
+               return upperLevels;
+       }
+
+       @Override
+       public int hashCode() {
+               return geonameId.intValue();
+       }
+
+       @Override
+       public boolean equals(Object obj) {
+               if (!(obj instanceof GeonamesAdm))
+                       return false;
+               GeonamesAdm other = (GeonamesAdm) obj;
+               return geonameId.equals(other.geonameId);
+       }
+
+       @Override
+       public String toString() {
+               return name + " (ADM" + level + " " + geonameId + ")";
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/geonames/ImportGeonamesAdmin.java b/org.argeo.app.geo/src/org/argeo/app/geo/geonames/ImportGeonamesAdmin.java
new file mode 100644 (file)
index 0000000..be2b507
--- /dev/null
@@ -0,0 +1,93 @@
+package org.argeo.app.geo.geonames;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.argeo.cms.util.CsvParser;
+import org.argeo.cms.util.CsvWriter;
+
+/** Import GeoNames administrative division from the main table. */
+public class ImportGeonamesAdmin {
+       // private Log log = LogFactory.getLog(ImportGeonamesAdmin.class);
+       private Map<Long, GeonamesAdm> geonamesAdms = new HashMap<>();
+
+       /** Loads the data. */
+       public void parse(InputStream in) {
+               Map<String, Long> countryGeonameIds = new HashMap<>();
+               Map<String, Long> admin1GeonameIds = new HashMap<>();
+               CsvParser csvParser = new CsvParser() {
+
+                       @Override
+                       protected void processLine(Integer lineNumber, List<String> header, List<String> tokens) {
+                               if (!"A".equals(tokens.get(6)))
+                                       return;
+                               GeonamesAdm geonamesAdm = new GeonamesAdm(tokens);
+                               geonamesAdms.put(geonamesAdm.getGeonameId(), geonamesAdm);
+                               if (geonamesAdm.getAdmLevel().equals("PCLI"))
+                                       countryGeonameIds.put(geonamesAdm.getCountryCode(), geonamesAdm.getGeonameId());
+                               if (geonamesAdm.getAdmLevel().equals("ADM1"))
+                                       admin1GeonameIds.put(geonamesAdm.getAdminCode1(), geonamesAdm.getGeonameId());
+                       }
+               };
+               csvParser.setSeparator('\t');
+               csvParser.setNoHeader(true);
+               csvParser.parse(in, StandardCharsets.UTF_8);
+
+               // fill upper levels
+               for (GeonamesAdm adm : geonamesAdms.values()) {
+                       adm.getUpperLevelIds()[0] = countryGeonameIds.get(adm.getCountryCode());
+                       if (adm.getLevel() > 0)
+                               adm.getUpperLevelIds()[1] = admin1GeonameIds.get(adm.getAdminCode1());
+                       adm.mapUpperLevels(geonamesAdms);
+               }
+
+       }
+
+       public Map<Long, GeonamesAdm> getGeonamesAdms() {
+               return geonamesAdms;
+       }
+
+       /**
+        * Copies only the Geonames of feature class 'A' (administrative subdivisions).
+        */
+       public static void filterGeonamesAdm(InputStream in, OutputStream out) {
+               CsvWriter csvWriter = new CsvWriter(out, StandardCharsets.UTF_8);
+               csvWriter.setSeparator('\t');
+               CsvParser csvParser = new CsvParser() {
+
+                       @Override
+                       protected void processLine(Integer lineNumber, List<String> header, List<String> tokens) {
+                               if (tokens.size() < 7 || !"A".equals(tokens.get(6)))
+                                       return;
+                               csvWriter.writeLine(tokens);
+                       }
+               };
+               csvParser.setSeparator('\t');
+               csvParser.setNoHeader(true);
+               csvParser.parse(in, StandardCharsets.UTF_8);
+       }
+
+       public static void main(String[] args) throws IOException {
+//             String country = "allCountries";
+               String country = "CI";
+//             try (InputStream in = Files
+//                             .newInputStream(Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + ".txt"));
+//                             OutputStream out = Files.newOutputStream(
+//                                             Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) {
+//                     ImportGeonamesAdmin.filterGeonamesAdm(in, out);
+//             }
+               try (InputStream in = Files.newInputStream(
+                               Paths.get(System.getProperty("user.home") + "/gis/data/geonames/" + country + "-adm.txt"))) {
+                       ImportGeonamesAdmin importGeonamesAdmin = new ImportGeonamesAdmin();
+                       importGeonamesAdmin.parse(in);
+               }
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/http/WfsHttpHandler.java b/org.argeo.app.geo/src/org/argeo/app/geo/http/WfsHttpHandler.java
new file mode 100644 (file)
index 0000000..21cc6c4
--- /dev/null
@@ -0,0 +1,475 @@
+package org.argeo.app.geo.http;
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UncheckedIOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.search.AndFilter;
+import org.argeo.api.acr.spi.ProvidedRepository;
+import org.argeo.api.app.EntityName;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.WGS84PosName;
+import org.argeo.api.app.geo.FeatureAdapter;
+import org.argeo.api.app.geo.WfsKvp;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.geo.CqlUtils;
+import org.argeo.app.geo.GeoJson;
+import org.argeo.app.geo.GeoUtils;
+import org.argeo.app.geo.acr.GeoEntityUtils;
+import org.argeo.cms.acr.json.AcrJsonUtils;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.http.HttpHeader;
+import org.argeo.cms.http.HttpStatus;
+import org.argeo.cms.http.RemoteAuthHttpExchange;
+import org.argeo.cms.http.server.HttpServerUtils;
+import org.argeo.cms.util.LangUtils;
+import org.geotools.api.referencing.FactoryException;
+import org.geotools.api.referencing.crs.CoordinateReferenceSystem;
+import org.geotools.api.referencing.operation.MathTransform;
+import org.geotools.api.referencing.operation.TransformException;
+import org.geotools.referencing.CRS;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.Envelope;
+import org.locationtech.jts.geom.Geometry;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+
+import jakarta.json.Json;
+import jakarta.json.stream.JsonGenerator;
+
+/** A partially implemented WFS 2.0 server. */
+public class WfsHttpHandler implements HttpHandler {
+       private final static CmsLog log = CmsLog.getLog(WfsHttpHandler.class);
+       private ProvidedRepository contentRepository;
+
+       private final Map<QName, FeatureAdapter> featureAdapters = new HashMap<>();
+
+       @Override
+       public void handle(HttpExchange exchange) throws IOException {
+               try {
+                       ContentSession session = HttpServerUtils.getContentSession(contentRepository, exchange);
+
+                       String path = HttpServerUtils.subPath(exchange);
+
+                       // content path
+                       final String pathToUse = path;
+                       String fileName = null;
+                       boolean zipped = false;
+
+                       Map<String, List<String>> parameters = HttpServerUtils.parseParameters(exchange);
+
+                       // PARAMETERS
+                       String cql = getKvpParameter(parameters, WfsKvp.CQL_FILTER);
+                       String typeNamesStr = getKvpParameter(parameters, WfsKvp.TYPE_NAMES);
+                       String outputFormat = getKvpParameter(parameters, WfsKvp.OUTPUT_FORMAT);
+                       if (outputFormat == null) {
+                               outputFormat = "application/json";
+                       }
+
+                       // TODO deal with multiple
+                       String formatOption = getKvpParameter(parameters, WfsKvp.FORMAT_OPTIONS);
+                       if (formatOption != null) {
+                               if (formatOption.startsWith(WfsKvp.FILENAME_))
+                                       fileName = formatOption.substring(WfsKvp.FILENAME_.length());
+                       }
+                       if (fileName != null && fileName.endsWith(".zip"))
+                               zipped = true;
+
+                       // bbox
+                       String bboxStr = getKvpParameter(parameters, WfsKvp.BBOX);
+                       if (log.isTraceEnabled())
+                               log.trace(bboxStr);
+                       final Envelope bbox;
+                       if (bboxStr != null) {
+                               String srs;
+                               String[] arr = bboxStr.split(",");
+                               // TODO check SRS and convert to WGS84
+                               double minLat = Double.parseDouble(arr[0]);
+                               double minLon = Double.parseDouble(arr[1]);
+                               double maxLat = Double.parseDouble(arr[2]);
+                               double maxLon = Double.parseDouble(arr[3]);
+                               if (arr.length == 5) {
+                                       srs = arr[4];
+                               } else {
+                                       srs = null;
+                               }
+
+                               if (srs != null && !srs.equals(GeoUtils.EPSG_4326)) {
+                                       try {
+                                               // TODO optimise
+                                               CoordinateReferenceSystem sourceCRS = CRS.decode(srs);
+                                               CoordinateReferenceSystem targetCRS = CRS.decode(GeoUtils.EPSG_4326);
+                                               MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
+                                               bbox = org.geotools.geometry.jts.JTS.transform(
+                                                               new Envelope(new Coordinate(minLat, minLon), new Coordinate(maxLat, maxLon)),
+                                                               transform);
+                                       } catch (FactoryException | TransformException e) {
+                                               throw new IllegalArgumentException("Cannot convert bounding box", e);
+                                               // bbox = null;
+                                       }
+                               } else {
+                                       bbox = new Envelope(new Coordinate(minLat, minLon), new Coordinate(maxLat, maxLon));
+                               }
+                       } else {
+                               bbox = null;
+                       }
+
+                       // response headers
+                       exchange.getResponseHeaders().set(HttpHeader.DATE.getHeaderName(),
+                                       Long.toString(System.currentTimeMillis()));
+
+                       if (fileName != null) {
+                               exchange.getResponseHeaders().set(HttpHeader.CONTENT_DISPOSITION.getHeaderName(),
+                                               HttpHeader.ATTACHMENT + ";" + HttpHeader.FILENAME + "=\"" + fileName + "\"");
+
+                       }
+
+                       // content type
+                       if (zipped) {
+                               exchange.getResponseHeaders().set(HttpHeader.CONTENT_TYPE.getHeaderName(), "application/zip");
+
+                       } else {
+                               switch (outputFormat) {
+                               case "application/json" -> {
+                                       exchange.getResponseHeaders().set(HttpHeader.CONTENT_TYPE.getHeaderName(), "application/json");
+                               }
+                               case "GML3" -> {
+//                     exchange.getResponseHeaders().set(HttpHeader.CONTENT_TYPE.getHeaderName(), "application/gml+xml");
+                                       exchange.getResponseHeaders().set(HttpHeader.CONTENT_TYPE.getHeaderName(), "application/xml");
+                               }
+
+                               default -> throw new IllegalArgumentException("Unexpected value: " + outputFormat);
+                               }
+                       }
+
+                       List<QName> typeNames = new ArrayList<>();
+                       if (typeNamesStr != null) {
+                               String[] arr = typeNamesStr.split(",");
+                               for (int i = 0; i < arr.length; i++) {
+                                       typeNames.add(NamespaceUtils.parsePrefixedName(arr[i]));
+                               }
+                       } else {
+                               typeNames.add(EntityType.local.qName());
+                       }
+
+                       if (typeNames.size() > 1)
+                               throw new UnsupportedOperationException("Only one type name is currently supported");
+
+                       // QUERY
+                       Stream<Content> res = session.search((search) -> {
+                               if (cql != null) {
+                                       CqlUtils.filter(search.from(pathToUse), cql);
+                               } else {
+                                       search.from(pathToUse);
+                               }
+                               for (QName typeName : typeNames) {
+                                       FeatureAdapter featureAdapter = featureAdapters.get(typeName);
+                                       if (featureAdapter == null)
+                                               throw new IllegalStateException("No feature adapter found for " + typeName);
+                                       // f.isContentClass(typeName);
+                                       RemoteAuthUtils.doAs(() -> {
+                                               featureAdapter.addConstraintsForFeature((AndFilter) search.getWhere(), typeName);
+                                               return null;
+                                       }, new RemoteAuthHttpExchange(exchange));
+                               }
+
+                               if (bbox != null) {
+                                       search.getWhere().any((or) -> {
+                                               // box overlap, see
+                                               // https://stackoverflow.com/questions/20925818/algorithm-to-check-if-two-boxes-overlap
+                                               // isOverlapping = (x1min < x2max AND x2min < x1max AND y1min < y2max AND y2min
+                                               // < y1max)
+                                               // x1 = entity, x2 = bbox
+                                               or.all((and) -> {
+                                                       and.lte(EntityName.minLat, bbox.getMaxX());
+                                                       and.gte(EntityName.maxLat, bbox.getMinX());
+                                                       and.lte(EntityName.minLon, bbox.getMaxY());
+                                                       and.gte(EntityName.maxLon, bbox.getMinY());
+                                               });
+                                               or.all((and) -> {
+                                                       and.gte(WGS84PosName.lat, bbox.getMinX());
+                                                       and.gte(WGS84PosName.lon, bbox.getMinY());
+                                                       and.lte(WGS84PosName.lat, bbox.getMaxX());
+                                                       and.lte(WGS84PosName.lon, bbox.getMaxY());
+                                               });
+                                       });
+                               }
+                       });
+
+                       exchange.sendResponseHeaders(HttpStatus.OK.getCode(), 0);
+
+                       final int BUFFER_SIZE = 100 * 1024;
+                       try (OutputStream out = zipped ? new ZipOutputStream(exchange.getResponseBody())
+                                       : new BufferedOutputStream(exchange.getResponseBody(), BUFFER_SIZE)) {
+                               if (out instanceof ZipOutputStream zipOut) {
+                                       String unzippedFileName = fileName.substring(0, fileName.length() - ".zip".length());
+                                       zipOut.putNextEntry(new ZipEntry(unzippedFileName));
+                               }
+
+                               if ("GML3".equals(outputFormat)) {
+                                       throw new UnsupportedOperationException();
+//                             encodeCollectionAsGML(res, out);
+                               } else if ("application/json".equals(outputFormat)) {
+                                       encodeCollectionAsGeoJSon(res, out, typeNames);
+                               }
+                       }
+               } catch (Exception e) {
+                       log.error("Cannot process WFS request " + exchange, e);
+                       try {
+                               exchange.sendResponseHeaders(HttpStatus.INTERNAL_SERVER_ERROR.getCode(), -1);
+                       } catch (IOException e1) {
+                               // silent
+                       }
+                       if (e instanceof IOException)
+                               throw (IOException) e;
+               }
+       }
+
+       /**
+        * Retrieve KVP (keyword-value pairs) parameters, which are lower case, as per
+        * specifications.
+        * 
+        * @see https://docs.ogc.org/is/09-025r2/09-025r2.html#19
+        */
+       protected String getKvpParameter(Map<String, List<String>> parameters, WfsKvp key) {
+               Objects.requireNonNull(key, "KVP key cannot be null");
+               // let's first try the default (CAML case) which should be more efficient
+               List<String> values = parameters.get(key.getKey());
+               if (values == null) {
+                       // then let's do an ignore case comparison of the key
+                       keys: for (String k : parameters.keySet()) {
+                               if (key.getKey().equalsIgnoreCase(k)) {
+                                       values = parameters.get(k);
+                                       break keys;
+                               }
+                       }
+               }
+               if (values == null) // nothing was found
+                       return null;
+               if (values.size() != 1) {
+                       // although not completely clear from the standard, we assume keys must be
+                       // unique
+                       // since lists are defined here
+                       // https://docs.ogc.org/is/09-026r2/09-026r2.html#10
+                       throw new IllegalArgumentException("Key " + key + " as multiple values");
+               }
+               String value = values.get(0);
+               assert value != null;
+               return value;
+       }
+
+       protected void encodeCollectionAsGeoJSon(Stream<Content> features, OutputStream out, List<QName> typeNames)
+                       throws IOException {
+               long begin = System.currentTimeMillis();
+               AtomicLong count = new AtomicLong(0);
+               JsonGenerator generator = Json.createGenerator(out);
+               generator.writeStartObject();
+               generator.write("type", "FeatureCollection");
+               generator.writeStartArray("features");
+               features.forEach((c) -> {
+                       // TODO deal with multiple type names
+                       FeatureAdapter featureAdapter = null;
+                       QName typeName = null;
+                       if (!typeNames.isEmpty()) {
+                               typeName = typeNames.get(0);
+                               featureAdapter = featureAdapters.get(typeName);
+                       }
+
+                       boolean geometryWritten = false;
+
+                       if (!geometryWritten) {
+
+                               Geometry defaultGeometry = featureAdapter != null ? featureAdapter.getDefaultGeometry(c, typeName)
+                                               : getDefaultGeometry(c);
+                               if (defaultGeometry == null)
+                                       return;
+                               generator.writeStartObject();
+                               generator.write("type", "Feature");
+                               String featureId = getFeatureId(c);
+                               if (featureId != null)
+                                       generator.write("id", featureId);
+
+                               GeoJson.writeBBox(generator, defaultGeometry);
+                               generator.writeStartObject(GeoJson.GEOMETRY);
+                               GeoJson.writeGeometry(generator, defaultGeometry);
+                               generator.writeEnd();// geometry object
+                       }
+                       generator.writeStartObject(GeoJson.PROPERTIES);
+                       AcrJsonUtils.writeTimeProperties(generator, c);
+                       if (featureAdapter != null)
+                               featureAdapter.writeProperties(generator, c, typeName);
+                       else
+                               writeProperties(generator, c);
+                       generator.writeEnd();// properties object
+
+                       generator.writeEnd();// feature object
+
+                       if (count.incrementAndGet() % 10 == 0)
+                               try {
+                                       out.flush();
+                               } catch (IOException e) {
+                                       throw new UncheckedIOException(e);
+                               }
+               });
+               generator.writeEnd();// features array
+               generator.writeEnd().close();
+
+               if (log.isTraceEnabled())
+                       log.trace("GeoJSon encoding took " + (System.currentTimeMillis() - begin) + " ms.");
+       }
+
+       protected Geometry getDefaultGeometry(Content content) {
+               if (content.hasContentClass(EntityType.geopoint)) {
+                       return GeoEntityUtils.toPoint(content);
+               }
+               return null;
+       }
+
+       protected String getFeatureId(Content content) {
+               String uuid = content.attr(LdapAttr.entryUUID);
+               return uuid;
+       }
+
+       public void writeProperties(JsonGenerator generator, Content content) {
+               String path = content.getPath();
+               generator.write("path", path);
+               if (content.hasContentClass(EntityType.local)) {
+                       String type = content.attr(EntityName.type);
+                       generator.write("type", type);
+               } else {
+                       List<QName> contentClasses = content.getContentClasses();
+                       if (!contentClasses.isEmpty()) {
+                               generator.write("type", NamespaceUtils.toPrefixedName(contentClasses.get(0)));
+                       }
+               }
+
+       }
+
+//     protected void encodeCollectionAsGML(Stream<Content> features, OutputStream out) throws IOException {
+//             String entityType = "entity";
+//             URL schemaLocation = getClass().getResource("/org/argeo/app/api/entity.xsd");
+//             String namespace = "http://www.argeo.org/ns/entity";
+//
+//             GML gml = new GML(Version.WFS1_1);
+//             gml.setCoordinateReferenceSystem(DefaultGeographicCRS.WGS84);
+//             gml.setNamespace("local", namespace);
+//
+//             SimpleFeatureType featureType = gml.decodeSimpleFeatureType(schemaLocation,
+//                             new NameImpl(namespace, entityType + "Feature"));
+//
+////           CoordinateReferenceSystem crs=DefaultGeographicCRS.WGS84;
+////           QName featureName = new QName(namespace,"apafFieldFeature");
+////           GMLConfiguration configuration = new GMLConfiguration();
+////           FeatureType parsed = GTXML.parseFeatureType(configuration, featureName, crs);
+////           SimpleFeatureType featureType = DataUtilities.simple(parsed);
+//
+//             SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);
+//
+//             DefaultFeatureCollection featureCollection = new DefaultFeatureCollection();
+//
+//             features.forEach((c) -> {
+////                   boolean gpx = false;
+//                     Geometry the_geom = null;
+//                     Polygon the_area = null;
+////                   if (gpx) {
+//                     Content area = c.getContent("gpx/area.gpx").orElse(null);
+//                     if (area != null) {
+//
+//                             try (InputStream in = area.open(InputStream.class)) {
+//                                     the_area = GpxUtils.parseGpxTrackTo(in, Polygon.class);
+//                             } catch (IOException e) {
+//                                     throw new UncheckedIOException("Cannot parse " + c, e);
+//                             }
+//                     }
+////                   } else {
+//                     if (c.hasContentClass(EntityType.geopoint)) {
+//                             double latitude = c.get(WGS84PosName.lat, Double.class).get();
+//                             double longitude = c.get(WGS84PosName.lon, Double.class).get();
+//
+//                             Coordinate coordinate = new Coordinate(longitude, latitude);
+//                             the_geom = JTS.GEOMETRY_FACTORY.createPoint(coordinate);
+//                     }
+//
+////                   }
+//                     if (the_geom != null)
+//                             featureBuilder.set(new NameImpl(namespace, "geopoint"), the_geom);
+//                     if (the_area != null)
+//                             featureBuilder.set(new NameImpl(namespace, "area"), the_area);
+//
+//                     List<AttributeDescriptor> attrDescs = featureType.getAttributeDescriptors();
+//                     for (AttributeDescriptor attrDesc : attrDescs) {
+//                             if (attrDesc instanceof GeometryAttribute)
+//                                     continue;
+//                             Name name = attrDesc.getName();
+//                             QName qName = new QName(name.getNamespaceURI(), name.getLocalPart());
+//                             String value = c.attr(qName);
+//                             if (value == null) {
+//                                     value = c.attr(name.getLocalPart());
+//                             }
+//                             if (value != null) {
+//                                     featureBuilder.set(name, value);
+//                             }
+//                     }
+//
+//                     String uuid = c.attr(LdapAttr.entryUUID);
+//
+//                     SimpleFeature feature = featureBuilder.buildFeature(uuid);
+//                     featureCollection.add(feature);
+//
+//             });
+//             gml.encode(out, featureCollection);
+//             out.close();
+//
+//     }
+
+       /*
+        * DEPENDENCY INJECTION
+        */
+
+       public void addFeatureAdapter(FeatureAdapter featureAdapter, Map<String, Object> properties) {
+               List<String> typeNames = LangUtils.toStringList(properties.get(WfsKvp.TYPE_NAMES.getKey()));
+               if (typeNames.isEmpty()) {
+                       log.warn("FeatureAdapter " + featureAdapter.getClass() + " does not declare type names. Ignoring it...");
+                       return;
+               }
+
+               for (String tn : typeNames) {
+                       QName typeName = NamespaceUtils.parsePrefixedName(tn);
+                       featureAdapters.put(typeName, featureAdapter);
+               }
+       }
+
+       public void removeFeatureAdapter(FeatureAdapter featureAdapter, Map<String, Object> properties) {
+               List<String> typeNames = LangUtils.toStringList(properties.get(WfsKvp.TYPE_NAMES.getKey()));
+               if (!typeNames.isEmpty()) {
+                       // ignore if noe type name declared
+                       return;
+               }
+
+               for (String tn : typeNames) {
+                       QName typeName = NamespaceUtils.parsePrefixedName(tn);
+                       featureAdapters.remove(typeName);
+               }
+       }
+
+       public void setContentRepository(ProvidedRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/http/WfsUtils.java b/org.argeo.app.geo/src/org/argeo/app/geo/http/WfsUtils.java
new file mode 100644 (file)
index 0000000..f9876d9
--- /dev/null
@@ -0,0 +1,16 @@
+package org.argeo.app.geo.http;
+
+import javax.xml.namespace.NamespaceContext;
+
+/** Utilities around the WFS specifications. */
+public class WfsUtils {
+
+       public static NamespaceContext parseNamespacesKvpParameter() {
+               // TODO deal with multiple namespaces
+               return null;
+       }
+
+       /** singleton */
+       private WfsUtils() {
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/AbstractGeoJsObject.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/AbstractGeoJsObject.java
new file mode 100644 (file)
index 0000000..63b9351
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.app.geo.ux;
+
+import org.argeo.app.ux.js.AbstractJsObject;
+
+public class AbstractGeoJsObject extends AbstractJsObject {
+       public final static String ARGEO_APP_GEO_JS_URL = "/pkg/org.argeo.app.js/geo.html";
+       public final static String JS_PACKAGE = "argeo.app.geo";
+
+       public AbstractGeoJsObject(Object... args) {
+               super(args);
+       }
+
+       @Override
+       public String getJsPackage() {
+               return JS_PACKAGE;
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/BboxVectorSource.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/BboxVectorSource.java
new file mode 100644 (file)
index 0000000..fa0656c
--- /dev/null
@@ -0,0 +1,26 @@
+package org.argeo.app.geo.ux;
+
+import org.argeo.app.ol.FeatureFormat;
+import org.argeo.app.ol.VectorSource;
+
+public class BboxVectorSource extends VectorSource {
+
+       public BboxVectorSource(Object... args) {
+               super(args);
+       }
+
+       public BboxVectorSource(String baseUrl, FeatureFormat format) {
+               setFormat(format);
+               setBaseUrl(baseUrl);
+       }
+
+       @Override
+       public String getJsPackage() {
+               return AbstractGeoJsObject.JS_PACKAGE;
+       }
+
+       public void setBaseUrl(String baseUrl) {
+               doSetValue(null, "baseUrl", baseUrl);
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/MapPart.java
new file mode 100644 (file)
index 0000000..8d5da7e
--- /dev/null
@@ -0,0 +1,18 @@
+package org.argeo.app.geo.ux;
+
+/** An UX part displaying a map. */
+public interface MapPart {
+       void setCenter(double lng, double lat);
+
+       /** Event when a feature has been single-clicked. */
+       record FeatureSingleClickEvent(String path) {
+       };
+
+       /** Event when a feature has been selected. */
+       record FeatureSelectedEvent(String path) {
+       };
+
+       /** Event when a feature popup is requested. */
+       record FeaturePopupEvent(String path) {
+       };
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/OpenLayersMapPart.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/OpenLayersMapPart.java
new file mode 100644 (file)
index 0000000..0d99f40
--- /dev/null
@@ -0,0 +1,107 @@
+package org.argeo.app.geo.ux;
+
+import java.util.Map;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.argeo.app.ol.AbstractOlObject;
+import org.argeo.app.ol.Layer;
+import org.argeo.app.ol.OlMap;
+import org.argeo.app.ol.TileLayer;
+import org.argeo.app.ol.VectorLayer;
+import org.argeo.app.ux.js.JsClient;
+import org.locationtech.jts.geom.Envelope;
+
+/**
+ * A wrapper around an OpenLayers map, adding specific features, such as SLD
+ * styling.
+ */
+public class OpenLayersMapPart extends AbstractGeoJsObject implements MapPart {
+       private final String mapPartName;
+
+       public OpenLayersMapPart(JsClient jsClient, String mapPartName) {
+               super(mapPartName);
+               this.mapPartName = mapPartName;
+               create(jsClient, mapPartName);
+       }
+
+       public OlMap getMap() {
+               return new OlMap(getJsClient(), getReference() + ".getMap()");
+       }
+
+       public void setSld(String xml) {
+               executeMethod(getMethodName(), JsClient.escapeQuotes(xml));
+       }
+
+       public void setCenter(double lat, double lon) {
+               executeMethod(getMethodName(), lat, lon);
+       }
+
+       public void fit(double[] extent, Map<String, Object> options) {
+               executeMethod(getMethodName(), extent, options);
+       }
+
+       public void fit(Envelope extent, Map<String, Object> options) {
+               fit(new double[] { extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY() }, options);
+       }
+
+       public void applyStyle(String layerName, String styledLayerName) {
+               executeMethod(getMethodName(), layerName, styledLayerName);
+       }
+
+       public Layer getLayer(String name) {
+               // TODO deal with not found
+               String reference = getReference() + ".getLayerByName('" + name + "')";
+               if (getJsClient().isInstanceOf(reference, AbstractOlObject.getJsClassName(VectorLayer.class))) {
+                       return new VectorLayer(getJsClient(), reference);
+               } else if (getJsClient().isInstanceOf(reference, AbstractOlObject.getJsClassName(TileLayer.class))) {
+                       return new TileLayer(getJsClient(), reference);
+               } else {
+                       return new Layer(getJsClient(), reference);
+               }
+       }
+
+       public String getMapPartName() {
+               return mapPartName;
+       }
+
+       public void selectFeatures(String layerName, Object... ids) {
+               executeMethod(getMethodName(), layerName, (Object[]) ids);
+       }
+
+       public void fitToLayer(String layerName) {
+               executeMethod(getMethodName(), layerName);
+       }
+
+       /*
+        * CALLBACKS
+        */
+       public void onFeatureSelected(Consumer<FeatureSelectedEvent> toDo) {
+               addCallback("FeatureSelected", (arr) -> {
+                       toDo.accept(new FeatureSelectedEvent((String) arr[0]));
+                       return null;
+               });
+       }
+
+       public void onFeatureSingleClick(Consumer<FeatureSingleClickEvent> toDo) {
+               addCallback("FeatureSingleClick", (arr) -> {
+                       toDo.accept(new FeatureSingleClickEvent((String) arr[0]));
+                       return null;
+               });
+       }
+
+       public void onFeaturePopup(Function<FeaturePopupEvent, String> toDo) {
+               addCallback("FeaturePopup", (arr) -> {
+                       return toDo.apply(new FeaturePopupEvent((String) arr[0]));
+               });
+       }
+
+       protected void addCallback(String suffix, Function<Object[], Object> toDo) {
+               getJsClient().getReadyStage().thenAccept((ready) -> {
+                       String functionName = getJsClient().createJsFunction(getMapPartName() + "__on" + suffix, toDo);
+                       getJsClient().execute(getJsReference() + ".callbacks['on" + suffix + "']=" + functionName + ";");
+                       executeMethod("enable" + suffix);
+               });
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/geo/ux/SentinelCloudless.java b/org.argeo.app.geo/src/org/argeo/app/geo/ux/SentinelCloudless.java
new file mode 100644 (file)
index 0000000..36dcfe1
--- /dev/null
@@ -0,0 +1,16 @@
+package org.argeo.app.geo.ux;
+
+import org.argeo.app.ol.Source;
+
+public class SentinelCloudless extends Source {
+
+       public SentinelCloudless(Object... args) {
+               super(args);
+       }
+
+       @Override
+       public String getJsPackage() {
+               return "argeo.app.geo";
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/AbstractOlObject.java b/org.argeo.app.geo/src/org/argeo/app/ol/AbstractOlObject.java
new file mode 100644 (file)
index 0000000..db64d96
--- /dev/null
@@ -0,0 +1,76 @@
+package org.argeo.app.ol;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import org.argeo.app.ux.js.AbstractJsObject;
+
+public abstract class AbstractOlObject extends AbstractJsObject {
+       public final static String JS_PACKAGE = "argeo.tp.ol";
+
+       public AbstractOlObject(Object... args) {
+               super(args.length > 0 ? args : new Object[] { new HashMap<String, Object>() });
+       }
+
+//     public AbstractOlObject(Map<String, Object> options) {
+//             super(new Object[] { options });
+//     }
+
+       public String getJsPackage() {
+               return JS_PACKAGE;
+       }
+
+       @SuppressWarnings("unchecked")
+       protected Map<String, Object> getNewOptions() {
+               if (!isNew())
+                       throw new IllegalStateException("Object " + getJsClassName() + " is not new");
+               Object[] args = getJsConstructorArgs();
+               if (args.length != 1 || !(args[0] instanceof Map))
+                       throw new IllegalStateException("Object " + getJsClassName() + " has no available options");
+               return (Map<String, Object>) args[0];
+       }
+
+       protected void doSetValue(String methodName, String newOption, Object value) {
+               if (isNew()) {
+                       Objects.requireNonNull(newOption, "Value cannot be set as an option for " + getJsClassName() + ", use "
+                                       + methodName + "() after the object has been created");
+                       getNewOptions().put(newOption, value);
+               } else {
+                       Objects.requireNonNull(methodName, "Value cannot be set via a method for " + getJsClassName() + ", use "
+                                       + newOption + " before the object is created");
+                       executeMethod(methodName, value);
+               }
+       }
+
+       public void set(String key, Object value) {
+               set(key, value, false);
+       }
+
+       public void set(String key, Object value, boolean silent) {
+               if (isNew()) {
+                       getNewOptions().put(key, value);
+               } else {
+                       executeMethod(getMethodName(), new Object[] { key, value, silent });
+               }
+       }
+
+       public Object get(String key) {
+               if (isNew()) {
+                       return getNewOptions().get(key);
+               } else {
+                       // TDO deal with reference if we are trying to get an object
+                       return callMethod(getMethodName(), key);
+               }
+
+       }
+
+       public static String getJsClassName(Class<?> clss) {
+               if (AbstractOlObject.class.isAssignableFrom(clss)) {
+                       // NB: would failed for renamed classes
+                       return JS_PACKAGE + "." + clss.getSimpleName();
+               }
+               throw new IllegalArgumentException(clss + " is not an OpenLayers object");
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/FeatureFormat.java b/org.argeo.app.geo/src/org/argeo/app/ol/FeatureFormat.java
new file mode 100644 (file)
index 0000000..2d0f8bc
--- /dev/null
@@ -0,0 +1,9 @@
+package org.argeo.app.ol;
+
+public abstract class FeatureFormat extends AbstractOlObject {
+
+       public FeatureFormat(Object... args) {
+               super(args);
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/GeoJSON.java b/org.argeo.app.geo/src/org/argeo/app/ol/GeoJSON.java
new file mode 100644 (file)
index 0000000..3cab7bc
--- /dev/null
@@ -0,0 +1,9 @@
+package org.argeo.app.ol;
+
+public class GeoJSON extends FeatureFormat {
+
+       public GeoJSON(Object... args) {
+               super(args);
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/Layer.java b/org.argeo.app.geo/src/org/argeo/app/ol/Layer.java
new file mode 100644 (file)
index 0000000..feb0700
--- /dev/null
@@ -0,0 +1,60 @@
+package org.argeo.app.ol;
+
+import java.util.Objects;
+
+public class Layer extends AbstractOlObject {
+       public final static String NAME_KEY = "name";
+
+       // cached
+       private String name;
+
+       public Layer(Object... args) {
+               super(args);
+       }
+
+       public void setOpacity(double opacity) {
+               if (opacity < 0 || opacity > 1)
+                       throw new IllegalArgumentException("Opacity must be between 0 and 1");
+//             if (isNew())
+//                     getNewOptions().put("opacity", opacity);
+//             else
+//                     executeMethod(getMethodName(), opacity);
+               doSetValue(getMethodName(), "opacity", opacity);
+       }
+
+       public void setSource(Source source) {
+               Objects.requireNonNull(source);
+               if (isNew())
+                       getNewOptions().put("source", source);
+               else
+                       executeMethod(getMethodName(), source);
+       }
+
+       public Source getSource() {
+               String reference = getReference() + ".getSource()";
+               return new Source(getJsClient(), reference);
+       }
+
+       public void setMinResolution(double minResolution) {
+               if (isNew())
+                       getNewOptions().put("minResolution", minResolution);
+               else
+                       executeMethod(getMethodName(), minResolution);
+       }
+
+       public void setMaxResolution(double maxResolution) {
+               if (isNew())
+                       getNewOptions().put("maxResolution", maxResolution);
+               else
+                       executeMethod(getMethodName(), maxResolution);
+       }
+
+       public void setName(String name) {
+               set(NAME_KEY, name);
+               this.name = name;
+       }
+
+       public String getName() {
+               return name;
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/OSM.java b/org.argeo.app.geo/src/org/argeo/app/ol/OSM.java
new file mode 100644 (file)
index 0000000..6cc769f
--- /dev/null
@@ -0,0 +1,9 @@
+package org.argeo.app.ol;
+
+public class OSM extends Source {
+
+       public OSM(Object... args) {
+               super(args);
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/OlMap.java b/org.argeo.app.geo/src/org/argeo/app/ol/OlMap.java
new file mode 100644 (file)
index 0000000..6ca37e3
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.app.ol;
+
+public class OlMap extends AbstractOlObject {
+
+       public OlMap(Object... args) {
+               super(args);
+       }
+
+       public void addLayer(Layer layer) {
+               executeMethod(getMethodName(), layer);
+       }
+
+       public View getView() {
+               return new View(getJsClient(), getReference() + ".getView()");
+       }
+
+       @Override
+       public String getJsClassName() {
+               return getJsPackage() + ".Map";
+       }
+
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/Source.java b/org.argeo.app.geo/src/org/argeo/app/ol/Source.java
new file mode 100644 (file)
index 0000000..541353e
--- /dev/null
@@ -0,0 +1,12 @@
+package org.argeo.app.ol;
+
+public class Source extends AbstractOlObject {
+
+       public Source(Object... args) {
+               super(args);
+       }
+
+       public void refresh() {
+               executeMethod(getMethodName());
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/TileLayer.java b/org.argeo.app.geo/src/org/argeo/app/ol/TileLayer.java
new file mode 100644 (file)
index 0000000..32f58ac
--- /dev/null
@@ -0,0 +1,11 @@
+package org.argeo.app.ol;
+
+public class TileLayer extends Layer {
+       public TileLayer(Object... args) {
+               super(args);
+       }
+
+       public TileLayer(Source source) {
+               setSource(source);
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/VectorLayer.java b/org.argeo.app.geo/src/org/argeo/app/ol/VectorLayer.java
new file mode 100644 (file)
index 0000000..5a4b6b4
--- /dev/null
@@ -0,0 +1,16 @@
+package org.argeo.app.ol;
+
+public class VectorLayer extends Layer {
+       public VectorLayer(Object... args) {
+               super(args);
+       }
+
+       public VectorLayer(String name, Source source) {
+               this(source);
+               setName(name);
+       }
+
+       public VectorLayer(Source source) {
+               setSource(source);
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/VectorSource.java b/org.argeo.app.geo/src/org/argeo/app/ol/VectorSource.java
new file mode 100644 (file)
index 0000000..3b60d0b
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.app.ol;
+
+public class VectorSource extends Source {
+
+       public VectorSource(Object... args) {
+               super(args);
+       }
+
+       public VectorSource(String url, FeatureFormat format) {
+               setUrl(url);
+               setFormat(format);
+       }
+
+       public void setUrl(String url) {
+               doSetValue(getMethodName(), "url", url);
+       }
+
+       public void setFormat(FeatureFormat format) {
+               doSetValue(null, "format", format);
+       }
+}
diff --git a/org.argeo.app.geo/src/org/argeo/app/ol/View.java b/org.argeo.app.geo/src/org/argeo/app/ol/View.java
new file mode 100644 (file)
index 0000000..eab7a38
--- /dev/null
@@ -0,0 +1,28 @@
+package org.argeo.app.ol;
+
+public class View extends AbstractOlObject {
+       public View(Object... args) {
+               super(args);
+       }
+
+       public void setCenter(int[] coord) {
+               if (isNew())
+                       getNewOptions().put("center", coord);
+               else
+                       executeMethod(getMethodName(), new Object[] { coord });
+       }
+
+       public void setZoom(int zoom) {
+               if (isNew())
+                       getNewOptions().put("zoom", zoom);
+               else
+                       executeMethod(getMethodName(), zoom);
+       }
+
+//     public void fit(double[] extent) {
+//             executeMethod(getMethodName(), extent);
+//     }
+//     public void setProjection(String projection) {
+//             doSetValue(getMethodName(), "projection", projection);
+//     }
+}
diff --git a/org.argeo.app.jcr/.classpath b/org.argeo.app.jcr/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.jcr/.project b/org.argeo.app.jcr/.project
new file mode 100644 (file)
index 0000000..f66d439
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.jcr</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.jcr/OSGI-INF/appUserState.xml b/org.argeo.app.jcr/OSGI-INF/appUserState.xml
new file mode 100644 (file)
index 0000000..c870036
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.argeo.internal.app.jcr.appUserState">
+   <implementation class="org.argeo.internal.app.jcr.AppUserStateImpl"/>
+   <service>
+      <provide interface="org.argeo.api.app.AppUserState"/>
+   </service>
+   <reference bind="setJcrContentProvider" cardinality="1..1" interface="org.argeo.cms.jcr.acr.JcrContentProvider" name="JcrContentProvider" policy="static"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.ContentRepository" name="ContentRepository" policy="static"/>
+</scr:component>
diff --git a/org.argeo.app.jcr/OSGI-INF/maintenanceService.xml b/org.argeo.app.jcr/OSGI-INF/maintenanceService.xml
new file mode 100644 (file)
index 0000000..7167ff6
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="true"  name="Suite Maintenance Service">
+   <implementation class="org.argeo.internal.app.jcr.SuiteMaintenanceService"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+   <reference bind="setUserTransaction" cardinality="1..1" interface="org.argeo.api.cms.transaction.WorkTransaction" name="WorkTransaction" policy="static"/>
+   <reference bind="setUserAdmin" cardinality="1..1" interface="org.osgi.service.useradmin.UserAdmin" name="UserAdmin" policy="static"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.spi.ProvidedRepository" name="ContentRepository" policy="static"/>
+</scr:component>
diff --git a/org.argeo.app.jcr/OSGI-INF/termsManager.xml b/org.argeo.app.jcr/OSGI-INF/termsManager.xml
new file mode 100644 (file)
index 0000000..e75fec3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="true" name="Suite Terms Manager">
+   <implementation class="org.argeo.app.jcr.terms.SuiteTermsManager"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+   <service>
+      <provide interface="org.argeo.api.app.TermsManager"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.app.jcr/bnd.bnd b/org.argeo.app.jcr/bnd.bnd
new file mode 100644 (file)
index 0000000..087215f
--- /dev/null
@@ -0,0 +1,20 @@
+Service-Component:\
+OSGI-INF/termsManager.xml,\
+OSGI-INF/maintenanceService.xml,\
+OSGI-INF/appUserState.xml,\
+
+Import-Package:\
+javax.jcr.nodetype,\
+javax.jcr.security,\
+org.apache.jackrabbit.*;version="[1,4)",\
+org.argeo.cms.acr,\
+*
+
+Require-Capability:\
+cms.datamodel;filter:="(name=jcrx)"
+
+Provide-Capability:\
+cms.datamodel; name=entity; cnd=/org/argeo/app/jcr/entity.cnd,\
+cms.datamodel; name=xforms; cnd=/org/argeo/app/jcr/xforms/xforms.cnd; abstract=true,\
+cms.datamodel; name=odk; cnd=/org/argeo/app/jcr/odk/odk.cnd; abstract=true,\
+cms.datamodel; name=docbook; cnd=/org/argeo/app/jcr/docbook/docbook.cnd; abstract=true,\
diff --git a/org.argeo.app.jcr/build.properties b/org.argeo.app.jcr/build.properties
new file mode 100644 (file)
index 0000000..c58ea21
--- /dev/null
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/CustomMaintenanceService.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/CustomMaintenanceService.java
new file mode 100644 (file)
index 0000000..2882be0
--- /dev/null
@@ -0,0 +1,76 @@
+package org.argeo.app.jcr;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.ItemExistsException;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.maintenance.AbstractMaintenanceService;
+
+/** Base for custom initialisations. */
+public abstract class CustomMaintenanceService extends AbstractMaintenanceService {
+       private final static CmsLog log = CmsLog.getLog(AbstractMaintenanceService.class);
+
+       protected List<String> getTypologies() {
+               return new ArrayList<>();
+       }
+
+       protected String getTypologiesLoadBase() {
+               return "";
+       }
+
+       protected void loadTypologies(Node customBaseNode) throws RepositoryException, IOException {
+               List<String> typologies = getTypologies();
+               if (!typologies.isEmpty()) {
+                       Node termsBase = JcrUtils.getOrAdd(customBaseNode, EntityType.terms.name(), EntityType.typologies.get());
+                       for (String terms : typologies) {
+                               loadTerms(termsBase, terms);
+                       }
+                       // TODO do not save here, so that upper layers can decide when to save
+                       termsBase.getSession().save();
+               }
+       }
+
+       protected void loadTerms(Node termsBase, String name) throws IOException, RepositoryException {
+               try {
+//                     if (termsBase.hasNode(name))
+//                             return;
+                       String typologiesLoadBase = getTypologiesLoadBase();
+                       if (typologiesLoadBase.contains("/") && !typologiesLoadBase.endsWith("/"))
+                               typologiesLoadBase = typologiesLoadBase + "/";
+                       String termsLoadPath = typologiesLoadBase + name + ".xml";
+                       URL termsUrl = getClass().getResource(termsLoadPath);
+                       if (termsUrl == null)
+                               throw new IllegalArgumentException("Terms '" + name + "' not found.");
+                       try (InputStream in = termsUrl.openStream()) {
+                               termsBase.getSession().importXML(termsBase.getPath(), in,
+                                               ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+                       } catch (ItemExistsException e) {
+                               log.warn("Terms " + name + " exists with another UUID, removing it...");
+                               if (termsBase.hasNode(name))
+                                       termsBase.getNode(name).remove();
+                               try (InputStream in = termsUrl.openStream()) {
+                                       termsBase.getSession().importXML(termsBase.getPath(), in,
+                                                       ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+                               }
+                       }
+                       if (log.isDebugEnabled())
+                               log.debug("Terms '" + name + "' loaded.");
+                       // TODO do not save here, so that upper layers can decide when to save
+                       termsBase.getSession().save();
+               } catch (RepositoryException | IOException e) {
+                       log.error("Cannot load terms '" + name + "': " + e.getMessage());
+                       throw e;
+               }
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/JcrEntityDefinition.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/JcrEntityDefinition.java
new file mode 100644 (file)
index 0000000..26950a4
--- /dev/null
@@ -0,0 +1,73 @@
+package org.argeo.app.jcr;
+
+import java.util.Map;
+
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.argeo.api.app.EntityConstants;
+import org.argeo.api.app.EntityDefinition;
+import org.argeo.cms.jcr.CmsJcrUtils;
+import org.argeo.jcr.Jcr;
+import org.osgi.framework.BundleContext;
+
+/** An entity definition based on a JCR data structure. */
+@Deprecated
+public class JcrEntityDefinition implements EntityDefinition {
+       private Repository repository;
+
+       private String type;
+//     private String defaultEditorId;
+
+       public void init(BundleContext bundleContext, Map<String, String> properties) throws RepositoryException {
+               Session adminSession = CmsJcrUtils.openDataAdminSession(repository, null);
+               try {
+                       type = properties.get(EntityConstants.TYPE);
+                       if (type == null)
+                               throw new IllegalArgumentException("Entity type property " + EntityConstants.TYPE + " must be set.");
+//                     defaultEditorId = properties.get(EntityConstants.DEFAULT_EDITOR_ID);
+//                     String definitionPath = EntityNames.ENTITY_DEFINITIONS_PATH + '/' + type;
+//                     if (!adminSession.itemExists(definitionPath)) {
+//                             Node entityDefinition = JcrUtils.mkdirs(adminSession, definitionPath, EntityTypes.ENTITY_DEFINITION);
+////                           entityDefinition.addMixin(EntityTypes.ENTITY_DEFINITION);
+//                             adminSession.save();
+//                     }
+                       initJcr(adminSession);
+               } finally {
+                       Jcr.logout(adminSession);
+               }
+       }
+
+       /** To be overridden in order to perform additional initialisations. */
+       protected void initJcr(Session adminSession) throws RepositoryException {
+
+       }
+
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) throws RepositoryException {
+
+       }
+
+//     @Override
+//     public String getEditorId(Node entity) {
+//             return defaultEditorId;
+//     }
+
+       @Override
+       public String getType() {
+               return type;
+       }
+
+       protected Repository getRepository() {
+               return repository;
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+       public String toString() {
+               return "Entity Definition " + getType();
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/SuiteJcrUtils.java
new file mode 100644 (file)
index 0000000..82589f2
--- /dev/null
@@ -0,0 +1,114 @@
+package org.argeo.app.jcr;
+
+import static org.argeo.app.core.SuiteUtils.USER_DEVICES_NODE_NAME;
+import static org.argeo.app.core.SuiteUtils.USER_SESSIONS_NODE_NAME;
+import static org.argeo.app.core.SuiteUtils.USER_STATE_NODE_NAME;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.security.Privilege;
+import javax.security.auth.x500.X500Principal;
+
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.app.AppUserState;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.api.cms.auth.RoleNameUtils;
+import org.argeo.app.core.SuiteUtils;
+import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
+
+/** JCR utilities. */
+public class SuiteJcrUtils {
+       /** @deprecated Use {@link AppUserState} instead. */
+       @Deprecated
+       public static Node getOrCreateUserNode(Session adminSession, String userDn) {
+               try {
+                       Node usersBase = adminSession.getNode(EntityType.user.basePath());
+                       String uid = RoleNameUtils.getLastRdnValue(userDn);
+                       Node userNode;
+                       if (!usersBase.hasNode(uid)) {
+                               userNode = usersBase.addNode(uid, NodeType.NT_UNSTRUCTURED);
+                               userNode.addMixin(EntityType.user.get());
+                               userNode.addMixin(NodeType.MIX_CREATED);
+                               userNode.setProperty(LdapAttr.distinguishedName.get(), userDn.toString());
+                               userNode.setProperty(LdapAttr.uid.get(), uid);
+                       } else {
+                               userNode = usersBase.getNode(uid);
+                       }
+
+                       if (!userNode.hasNode(USER_SESSIONS_NODE_NAME)) {
+                               // Migrate existing user node
+                               Node sessionsNode = userNode.addNode(USER_SESSIONS_NODE_NAME, NodeType.NT_UNSTRUCTURED);
+                               oldSessions: for (NodeIterator nit = userNode.getNodes(); nit.hasNext();) {
+                                       Node child = nit.nextNode();
+                                       if (USER_SESSIONS_NODE_NAME.equals(child.getName()) || child.getName().startsWith("rep:")
+                                                       || child.getName().startsWith("jcr:"))
+                                               continue oldSessions;
+                                       Node target = sessionsNode.addNode(child.getName());
+                                       JcrUtils.copy(child, target);
+                               }
+
+                               Node userStateNode = userNode.addNode(USER_STATE_NODE_NAME, NodeType.NT_UNSTRUCTURED);
+                               Node userDevicesNode = userNode.addNode(USER_DEVICES_NODE_NAME, NodeType.NT_UNSTRUCTURED);
+
+                               adminSession.save();
+//                             JackrabbitSecurityUtils.denyPrivilege(adminSession, userNode.getPath(), SuiteRole.coworker.dn(),
+//                                             Privilege.JCR_READ);
+                               JcrUtils.addPrivilege(adminSession, userNode.getPath(), new X500Principal(userDn.toString()).getName(),
+                                               Privilege.JCR_READ);
+                               JcrUtils.addPrivilege(adminSession, userNode.getPath(), CmsConstants.ROLE_USER_ADMIN,
+                                               Privilege.JCR_ALL);
+
+                               JcrUtils.addPrivilege(adminSession, userStateNode.getPath(), userDn, Privilege.JCR_ALL);
+                               JcrUtils.addPrivilege(adminSession, userDevicesNode.getPath(), userDn, Privilege.JCR_ALL);
+                       }
+                       return userNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot create user node for " + userDn, e);
+               }
+       }
+
+       /** @deprecated Use {@link AppUserState} instead. */
+       @Deprecated
+       public static Node getCmsSessionNode(Session session, CmsSession cmsSession) {
+               try {
+                       return session.getNode(SuiteUtils.getUserNodePath(cmsSession.getUserDn()) + '/' + USER_SESSIONS_NODE_NAME
+                                       + '/' + cmsSession.uuid().toString());
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot get session dir for " + cmsSession, e);
+               }
+       }
+
+       /** @deprecated Use {@link AppUserState} instead. */
+       @Deprecated
+       public static Node getOrCreateCmsSessionNode(Session adminSession, CmsSession cmsSession) {
+               try {
+                       String userDn = cmsSession.getUserDn();
+                       Node userNode = getOrCreateUserNode(adminSession, userDn);
+                       Node sessionsNode = userNode.getNode(USER_SESSIONS_NODE_NAME);
+                       String cmsSessionUuid = cmsSession.uuid().toString();
+                       Node cmsSessionNode;
+                       if (!sessionsNode.hasNode(cmsSessionUuid)) {
+                               cmsSessionNode = sessionsNode.addNode(cmsSessionUuid, NodeType.NT_UNSTRUCTURED);
+                               cmsSessionNode.addMixin(NodeType.MIX_CREATED);
+                               adminSession.save();
+                               JcrUtils.addPrivilege(adminSession, cmsSessionNode.getPath(), cmsSession.getUserRole(),
+                                               Privilege.JCR_ALL);
+                       } else {
+                               cmsSessionNode = sessionsNode.getNode(cmsSessionUuid);
+                       }
+                       return cmsSessionNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot create session dir for " + cmsSession, e);
+               }
+       }
+
+       /** singleton */
+       private SuiteJcrUtils() {
+       }
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/XPathUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/XPathUtils.java
new file mode 100644 (file)
index 0000000..2c3babe
--- /dev/null
@@ -0,0 +1,175 @@
+package org.argeo.app.jcr;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryManager;
+
+import org.apache.jackrabbit.util.ISO9075;
+import org.argeo.api.cms.CmsLog;
+
+/** Ease XPath generation for JCR requests */
+public class XPathUtils {
+       private final static CmsLog log = CmsLog.getLog(XPathUtils.class);
+
+       private final static String QUERY_XPATH = "xpath";
+
+       public static String descendantFrom(String parentPath) {
+               if (notEmpty(parentPath)) {
+                       if ("/".equals(parentPath))
+                               parentPath = "";
+                       // Hardcoded dependency to Jackrabbit. Remove
+                       String result = "/jcr:root" + ISO9075.encodePath(parentPath);
+                       if (log.isTraceEnabled()) {
+                               String result2 = "/jcr:root" + parentPath;
+                               if (!result2.equals(result))
+                                       log.warn("Encoded Path " + result2 + " --> " + result);
+                       }
+                       return result;
+               } else
+                       return "";
+       }
+
+       public static String localAnd(String... conditions) {
+               StringBuilder builder = new StringBuilder();
+               for (String condition : conditions) {
+                       if (notEmpty(condition)) {
+                               builder.append(" ").append(condition).append(" and ");
+                       }
+               }
+               if (builder.length() > 3)
+                       return builder.substring(0, builder.length() - 4);
+               else
+                       return "";
+       }
+
+       public static String xPathNot(String condition) {
+               if (notEmpty(condition))
+                       return "not(" + condition + ")";
+               else
+                       return "";
+       }
+
+       public static String getFreeTextConstraint(String filter) throws RepositoryException {
+               StringBuilder builder = new StringBuilder();
+               if (notEmpty(filter)) {
+                       String[] strs = filter.trim().split(" ");
+                       for (String token : strs) {
+                               builder.append("jcr:contains(.,'*" + encodeXPathStringValue(token) + "*') and ");
+                       }
+                       return builder.substring(0, builder.length() - 4);
+               }
+               return "";
+       }
+
+       public static String getPropertyContains(String propertyName, String filter) throws RepositoryException {
+               if (notEmpty(filter))
+                       return "jcr:contains(@" + propertyName + ",'*" + encodeXPathStringValue(filter) + "*')";
+               return "";
+       }
+
+       private final static DateFormat jcrRefFormatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'+02:00'");
+
+       /**
+        * @param propertyName
+        * @param calendar       the reference date
+        * @param lowerOrGreater "&lt;", "&gt;" TODO validate "&gt;="
+        * @throws RepositoryException
+        */
+       public static String getPropertyDateComparaison(String propertyName, Calendar cal, String lowerOrGreater)
+                       throws RepositoryException {
+               if (cal != null) {
+                       String jcrDateStr = jcrRefFormatter.format(cal.getTime());
+
+                       // jcrDateStr = "2015-08-03T05:00:03:000Z";
+                       String result = "@" + propertyName + " " + lowerOrGreater + " xs:dateTime('" + jcrDateStr + "')";
+                       return result;
+               }
+               return "";
+       }
+
+       public static String getPropertyEquals(String propertyName, String value) {
+               if (notEmpty(value))
+                       return "@" + propertyName + "='" + encodeXPathStringValue(value) + "'";
+               return "";
+       }
+
+       public static String encodeXPathStringValue(String propertyValue) {
+               // TODO implement safer mechanism to escape invalid characters
+               // Also check why we have used this regex in ResourceSerrviceImpl l 474
+               // String cleanedKey = key.replaceAll("(?:')", "''");
+               String result = propertyValue.replaceAll("'", "''");
+               return result;
+       }
+
+       public static void andAppend(StringBuilder builder, String condition) {
+               if (notEmpty(condition)) {
+                       builder.append(condition);
+                       builder.append(" and ");
+               }
+       }
+
+       public static void appendOrderByProperties(StringBuilder builder, boolean ascending, String... propertyNames) {
+               if (propertyNames.length > 0) {
+                       builder.append(" order by ");
+                       for (String propName : propertyNames)
+                               builder.append("@").append(propName).append(", ");
+                       builder = builder.delete(builder.length() - 2, builder.length());
+                       if (ascending)
+                               builder.append(" ascending ");
+                       else
+                               builder.append(" descending ");
+               }
+       }
+
+       public static void appendAndPropStringCondition(StringBuilder builder, String propertyName, String filter)
+                       throws RepositoryException {
+               if (notEmpty(filter)) {
+                       andAppend(builder, getPropertyContains(propertyName, filter));
+               }
+       }
+
+       public static void appendAndNotPropStringCondition(StringBuilder builder, String propertyName, String filter)
+                       throws RepositoryException {
+               if (notEmpty(filter)) {
+                       String cond = getPropertyContains(propertyName, filter);
+                       builder.append(xPathNot(cond));
+                       builder.append(" and ");
+               }
+       }
+
+       public static Query createQuery(Session session, String queryString) throws RepositoryException {
+               QueryManager queryManager = session.getWorkspace().getQueryManager();
+               // Localise JCR properties for XPATH
+               queryString = localiseJcrItemNames(queryString);
+               return queryManager.createQuery(queryString, QUERY_XPATH);
+       }
+
+       private final static String NS_JCR = "\\{http://www.jcp.org/jcr/1.0\\}";
+       private final static String NS_NT = "\\{http://www.jcp.org/jcr/nt/1.0\\}";
+       private final static String NS_MIX = "\\{http://www.jcp.org/jcr/mix/1.0\\}";
+
+       /**
+        * Replace the generic namespace with the local "jcr:", "nt:", "mix:" values. It
+        * is a workaround that must be later cleaned
+        */
+       public static String localiseJcrItemNames(String name) {
+               name = name.replaceAll(NS_JCR, "jcr:");
+               name = name.replaceAll(NS_NT, "nt:");
+               name = name.replaceAll(NS_MIX, "mix:");
+               return name;
+       }
+
+       private static boolean notEmpty(String stringToTest) {
+               return !(stringToTest == null || "".equals(stringToTest.trim()));
+       }
+
+       /** Singleton. */
+       private XPathUtils() {
+
+       }
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/Dbk4Converter.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/Dbk4Converter.java
new file mode 100644 (file)
index 0000000..60f2928
--- /dev/null
@@ -0,0 +1,103 @@
+package org.argeo.app.jcr.docbook;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.argeo.jcr.JcrException;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import net.sf.saxon.BasicTransformerFactory;
+import net.sf.saxon.TransformerFactoryImpl;
+
+/** Convert from DocBook v4 to DocBook v5, using the official XSL. */
+public class Dbk4Converter {
+       private final Templates templates;
+
+       public Dbk4Converter() {
+               try (InputStream in = getClass().getResourceAsStream("db4-upgrade.xsl")) {
+                       Source xsl = new StreamSource(in);
+                       TransformerFactory transformerFactory = new BasicTransformerFactory();
+//                     TransformerFactory transformerFactory = new TransformerFactoryImpl();
+                       templates = transformerFactory.newTemplates(xsl);
+               } catch (IOException | TransformerConfigurationException e) {
+                       throw new RuntimeException("Cannot initialise DocBook v4 converter", e);
+               }
+       }
+
+       public void importXml(Node baseNode, InputStream in) throws IOException {
+               try (ByteArrayOutputStream out = new ByteArrayOutputStream();) {
+                       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                       factory.setXIncludeAware(true);
+                       factory.setNamespaceAware(true);
+                       DocumentBuilder docBuilder = factory.newDocumentBuilder();
+                       Document doc = docBuilder.parse(new InputSource(in));
+                       Source xmlInput = new DOMSource(doc);
+
+//                     ContentHandler contentHandler = baseNode.getSession().getImportContentHandler(baseNode.getPath(),
+//                                     ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+
+                       Transformer transformer = templates.newTransformer();
+                       Result xmlOutput = new StreamResult(out);
+                       transformer.transform(xmlInput, xmlOutput);
+                       try (InputStream dbk5in = new ByteArrayInputStream(out.toByteArray())) {
+                               baseNode.getSession().importXML(baseNode.getPath(), dbk5in,
+                                               ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot import XML to " + baseNode, e);
+               } catch (TransformerException | SAXException | ParserConfigurationException e) {
+                       throw new RuntimeException("Cannot import DocBook v4 to " + baseNode, e);
+               }
+
+       }
+
+       public static void main(String[] args) {
+               try {
+
+                       Source xsl = new StreamSource(new File("/usr/share/xml/docbook5/stylesheet/upgrade/db4-upgrade.xsl"));
+                       TransformerFactory transformerFactory = new TransformerFactoryImpl();
+                       Templates templates = transformerFactory.newTemplates(xsl);
+
+                       File inputDir = new File(args[0]);
+                       File outputDir = new File(args[1]);
+
+                       for (File inputFile : inputDir.listFiles()) {
+                               Result xmlOutput = new StreamResult(new File(outputDir, inputFile.getName()));
+
+                               DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                               factory.setXIncludeAware(true);
+                               factory.setNamespaceAware(true);
+                               DocumentBuilder docBuilder = factory.newDocumentBuilder();
+                               Document doc = docBuilder.parse(inputFile);
+                               Source xmlInput = new DOMSource(doc);
+                               Transformer transformer = templates.newTransformer();
+                               transformer.transform(xmlInput, xmlOutput);
+                       }
+               } catch (Throwable e) {
+                       e.printStackTrace();
+               }
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/DbkJcrUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/DbkJcrUtils.java
new file mode 100644 (file)
index 0000000..c7692dd
--- /dev/null
@@ -0,0 +1,253 @@
+package org.argeo.app.jcr.docbook;
+
+import static org.argeo.app.docbook.DbkType.para;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.JcrxApi;
+
+/** JCR utilities around DocBook. */
+public class DbkJcrUtils {
+       private final static CmsLog log = CmsLog.getLog(DbkJcrUtils.class);
+
+       /** Get or add a DocBook element. */
+       public static Node getOrAddDbk(Node parent, DbkType child) {
+               try {
+                       if (!parent.hasNode(child.get())) {
+                               return addDbk(parent, child);
+                       } else {
+                               return parent.getNode(child.get());
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot get or add element " + child.get() + " to " + parent, e);
+               }
+       }
+
+       /** Add a DocBook element to this node. */
+       public static Node addDbk(Node parent, DbkType child) {
+               try {
+                       Node node = parent.addNode(child.get(), child.get());
+                       return node;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add element " + child.get() + " to " + parent, e);
+               }
+       }
+
+       /** Whether this DocBook element is of this type. */
+       public static boolean isDbk(Node node, DbkType type) {
+               return Jcr.getName(node).equals(type.get());
+       }
+
+       /** Whether this node is a DocBook type. */
+       public static boolean isDbk(Node node) {
+               String name = Jcr.getName(node);
+               for (DbkType type : DbkType.values()) {
+                       if (name.equals(type.get()))
+                               return true;
+               }
+               return false;
+       }
+
+       public static String getTitle(Node node) {
+               return JcrxApi.getXmlValue(node, DbkType.title.get());
+       }
+
+       public static void setTitle(Node node, String txt) {
+               Node titleNode = getOrAddDbk(node, DbkType.title);
+               JcrxApi.setXmlValue(titleNode, txt);
+       }
+
+       public static Node getMetadata(Node infoContainer) {
+               try {
+                       if (!infoContainer.hasNode(DbkType.info.get()))
+                               return null;
+                       Node info = infoContainer.getNode(DbkType.info.get());
+                       if (!info.hasNode(EntityType.local.get()))
+                               return null;
+                       return info.getNode(EntityType.local.get());
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot retrieve metadata from " + infoContainer, e);
+               }
+       }
+
+       public static Node getChildByRole(Node parent, String role) {
+               try {
+                       NodeIterator baseSections = parent.getNodes();
+                       while (baseSections.hasNext()) {
+                               Node n = baseSections.nextNode();
+                               String r = Jcr.get(n, DbkAttr.role.name());
+                               if (r != null && r.equals(role))
+                                       return n;
+                       }
+                       return null;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot get child from " + parent + " with role " + role, e);
+               }
+       }
+
+       public static Node addParagraph(Node node, String txt) {
+               Node p = addDbk(node, para);
+               JcrxApi.setXmlValue(p, txt);
+               return p;
+       }
+
+       /**
+        * Removes a paragraph if it empty. The sesison is not saved.
+        * 
+        * @return true if the paragraph was empty and it was removed
+        */
+       public static boolean removeIfEmptyParagraph(Node node) {
+               try {
+                       if (isDbk(node, DbkType.para)) {
+                               NodeIterator nit = node.getNodes();
+                               if (!nit.hasNext()) {
+                                       node.remove();
+                                       return true;
+                               }
+                               Node first = nit.nextNode();
+                               if (nit.hasNext())
+                                       return false;
+                               if (first.getName().equals(Jcr.JCR_XMLTEXT)) {
+                                       String str = Jcr.get(first, Jcr.JCR_XMLCHARACTERS);
+                                       if (str != null && str.trim().equals("")) {
+                                               node.remove();
+                                               return true;
+                                       }
+                               } else {
+                                       return false;
+                               }
+                       }
+                       return false;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot remove possibly empty paragraph", e);
+               }
+       }
+
+       public static Node insertImageAfter(Node sibling) {
+               try {
+
+                       Node parent = sibling.getParent();
+                       Node mediaNode = addDbk(parent, DbkType.mediaobject);
+                       // TODO optimise?
+                       parent.orderBefore(mediaNode.getName() + "[" + mediaNode.getIndex() + "]",
+                                       sibling.getName() + "[" + sibling.getIndex() + "]");
+                       parent.orderBefore(sibling.getName() + "[" + sibling.getIndex() + "]",
+                                       mediaNode.getName() + "[" + mediaNode.getIndex() + "]");
+
+                       Node imageNode = addDbk(mediaNode, DbkType.imageobject);
+                       Node imageDataNode = addDbk(imageNode, DbkType.imagedata);
+//                     Node infoNode = imageNode.addNode(DocBookTypes.INFO, DocBookTypes.INFO);
+//                     Node fileNode = JcrUtils.copyBytesAsFile(mediaFolder, EntityType.box.get(), new byte[0]);
+//                     fileNode.addMixin(EntityType.box.get());
+//                     fileNode.setProperty(EntityNames.SVG_WIDTH, 0);
+//                     fileNode.setProperty(EntityNames.SVG_LENGTH, 0);
+//                     fileNode.addMixin(NodeType.MIX_MIMETYPE);
+//
+//                     // we assume this is a folder next to the main DocBook document
+//                     // TODO make it more robust and generic
+//                     String fileRef = mediaNode.getName();
+//                     imageDataNode.setProperty(DocBookNames.DBK_FILEREF, fileRef);
+                       return mediaNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot insert empty image after " + sibling, e);
+               }
+       }
+
+       public static Node insertVideoAfter(Node sibling) {
+               try {
+
+                       Node parent = sibling.getParent();
+                       Node mediaNode = addDbk(parent, DbkType.mediaobject);
+                       // TODO optimise?
+                       parent.orderBefore(mediaNode.getName() + "[" + mediaNode.getIndex() + "]",
+                                       sibling.getName() + "[" + sibling.getIndex() + "]");
+                       parent.orderBefore(sibling.getName() + "[" + sibling.getIndex() + "]",
+                                       mediaNode.getName() + "[" + mediaNode.getIndex() + "]");
+
+                       Node videoNode = addDbk(mediaNode, DbkType.videoobject);
+                       Node videoDataNode = addDbk(videoNode, DbkType.videodata);
+                       return mediaNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot insert empty image after " + sibling, e);
+               }
+       }
+
+       public static String getMediaFileref(Node node) {
+               try {
+                       Node mediadata;
+                       if (node.hasNode(DbkType.imageobject.get())) {
+                               mediadata = node.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get());
+                       } else if (node.hasNode(DbkType.videoobject.get())) {
+                               mediadata = node.getNode(DbkType.videoobject.get()).getNode(DbkType.videodata.get());
+                       } else {
+                               throw new IllegalArgumentException("Fileref not found in " + node);
+                       }
+
+                       if (mediadata.hasProperty(DbkAttr.fileref.name())) {
+                               return mediadata.getProperty(DbkAttr.fileref.name()).getString();
+                       } else {
+                               return null;
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot retrieve file ref from " + node, e);
+               }
+       }
+
+       public static void exportXml(Node node, OutputStream out) throws IOException {
+               try {
+                       node.getSession().exportDocumentView(node.getPath(), out, false, false);
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot export " + node + " to XML", e);
+               }
+       }
+
+       public static void exportToFs(Node baseNode, DbkType type, Path directory) {
+               String fileName = Jcr.getName(baseNode) + ".dbk.xml";
+               Path filePath = directory.resolve(fileName);
+               Node docBookNode = Jcr.getNode(baseNode, type.get());
+               if (docBookNode == null)
+                       throw new IllegalArgumentException("No " + type.get() + " under " + baseNode);
+               try {
+                       Files.createDirectories(directory);
+                       try (OutputStream out = Files.newOutputStream(filePath)) {
+                               exportXml(docBookNode, out);
+                       }
+                       JcrUtils.copyFilesToFs(baseNode, directory, true);
+                       if (log.isDebugEnabled())
+                               log.debug("DocBook " + baseNode + " exported to " + filePath.toAbsolutePath());
+               } catch (IOException e) {
+                       throw new RuntimeException(e);
+               }
+       }
+
+       public static void importXml(Node baseNode, InputStream in) throws IOException {
+               try {
+                       baseNode.getSession().importXML(baseNode.getPath(), in,
+                                       ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot import XML to " + baseNode, e);
+               }
+
+       }
+
+       /** Singleton. */
+       private DbkJcrUtils() {
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/db4-upgrade.xsl b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/db4-upgrade.xsl
new file mode 100644 (file)
index 0000000..00096be
--- /dev/null
@@ -0,0 +1,1398 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:exsl="http://exslt.org/common"
+               xmlns:db = "http://docbook.org/ns/docbook"
+               xmlns:xlink="http://www.w3.org/1999/xlink"
+                exclude-result-prefixes="exsl db"
+                version="1.0">
+
+<!--
+# ======================================================================
+# This file is part of DocBook V5.0CR5
+#
+# Copyright 2005 Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+#
+# Release: $Id: db4-upgrade.xsl 7660 2008-02-06 13:48:36Z nwalsh $
+#
+# Permission to use, copy, modify and distribute this stylesheet
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies. The copyright
+# holders make no representation about the suitability of the schema
+# for any purpose. It is provided "as is" without expressed or implied
+# warranty.
+#
+# Please direct all questions, bug reports, or suggestions for changes
+# to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+#
+# ======================================================================
+-->
+
+<xsl:variable name="version" select="'1.0'"/>
+
+<xsl:output method="xml" encoding="utf-8" indent="no" omit-xml-declaration="yes"/>
+
+<xsl:preserve-space elements="*"/>
+<xsl:param name="rootid">
+  <xsl:choose>
+  <xsl:when test="/*/@id">
+    <xsl:value-of select="/*/@id"/>
+  </xsl:when>
+  <xsl:otherwise>
+    <xsl:text>UNKNOWN</xsl:text>
+  </xsl:otherwise>
+  </xsl:choose>
+</xsl:param>
+
+<xsl:param name="defaultDate" select="''"/>
+
+<xsl:template match="/">
+  <xsl:variable name="converted">
+    <xsl:apply-templates/>
+  </xsl:variable>
+  <xsl:comment>
+    <xsl:text> Converted by db4-upgrade version </xsl:text>
+    <xsl:value-of select="$version"/>
+    <xsl:text> </xsl:text>
+  </xsl:comment>
+  <xsl:text>&#10;</xsl:text>
+  <xsl:apply-templates select="exsl:node-set($converted)/*" mode="addNS"/>
+</xsl:template>
+
+<xsl:template match="bookinfo|chapterinfo|articleinfo|artheader|appendixinfo
+                    |blockinfo
+                     |bibliographyinfo|glossaryinfo|indexinfo|setinfo
+                    |setindexinfo
+                     |sect1info|sect2info|sect3info|sect4info|sect5info
+                     |sectioninfo
+                     |refsect1info|refsect2info|refsect3info|refsectioninfo
+                    |referenceinfo|partinfo"
+              priority="200">
+  <info>
+    <xsl:call-template name="copy.attributes"/>
+
+    <!-- titles can be inside or outside or both. fix that -->
+    <xsl:choose>
+      <xsl:when test="title and following-sibling::title">
+        <xsl:if test="title != following-sibling::title">
+          <xsl:call-template name="emit-message">
+            <xsl:with-param name="message">
+              <xsl:text>Check </xsl:text>
+              <xsl:value-of select="name(..)"/>
+              <xsl:text> title.</xsl:text>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:if>
+        <xsl:apply-templates select="title" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="title">
+        <xsl:apply-templates select="title" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="following-sibling::title">
+        <xsl:apply-templates select="following-sibling::title" mode="copy"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:call-template name="emit-message">
+          <xsl:with-param name="message">
+            <xsl:text>Check </xsl:text>
+            <xsl:value-of select="name(..)"/>
+            <xsl:text>: no title.</xsl:text>
+          </xsl:with-param>
+        </xsl:call-template>
+      </xsl:otherwise>
+    </xsl:choose>
+
+    <xsl:choose>
+      <xsl:when test="titleabbrev and following-sibling::titleabbrev">
+        <xsl:if test="titleabbrev != following-sibling::titleabbrev">
+          <xsl:call-template name="emit-message">
+            <xsl:with-param name="message">
+              <xsl:text>Check </xsl:text>
+              <xsl:value-of select="name(..)"/>
+              <xsl:text> titleabbrev.</xsl:text>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:if>
+        <xsl:apply-templates select="titleabbrev" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="titleabbrev">
+        <xsl:apply-templates select="titleabbrev" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="following-sibling::titleabbrev">
+        <xsl:apply-templates select="following-sibling::titleabbrev" mode="copy"/>
+      </xsl:when>
+    </xsl:choose>
+
+    <xsl:choose>
+      <xsl:when test="subtitle and following-sibling::subtitle">
+        <xsl:if test="subtitle != following-sibling::subtitle">
+          <xsl:call-template name="emit-message">
+            <xsl:with-param name="message">
+              <xsl:text>Check </xsl:text>
+              <xsl:value-of select="name(..)"/>
+              <xsl:text> subtitle.</xsl:text>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:if>
+        <xsl:apply-templates select="subtitle" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="subtitle">
+        <xsl:apply-templates select="subtitle" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="following-sibling::subtitle">
+        <xsl:apply-templates select="following-sibling::subtitle" mode="copy"/>
+      </xsl:when>
+    </xsl:choose>
+
+    <xsl:apply-templates/>
+  </info>
+</xsl:template>
+
+<xsl:template match="objectinfo|prefaceinfo|refsynopsisdivinfo
+                    |screeninfo|sidebarinfo"
+             priority="200">
+  <info>
+    <xsl:call-template name="copy.attributes"/>
+
+    <!-- titles can be inside or outside or both. fix that -->
+    <xsl:choose>
+      <xsl:when test="title and following-sibling::title">
+        <xsl:if test="title != following-sibling::title">
+          <xsl:call-template name="emit-message">
+            <xsl:with-param name="message">
+              <xsl:text>Check </xsl:text>
+              <xsl:value-of select="name(..)"/>
+              <xsl:text> title.</xsl:text>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:if>
+        <xsl:apply-templates select="title" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="title">
+        <xsl:apply-templates select="title" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="following-sibling::title">
+        <xsl:apply-templates select="following-sibling::title" mode="copy"/>
+      </xsl:when>
+      <xsl:otherwise>
+       <!-- it's ok if there's no title on these -->
+      </xsl:otherwise>
+    </xsl:choose>
+
+    <xsl:choose>
+      <xsl:when test="titleabbrev and following-sibling::titleabbrev">
+        <xsl:if test="titleabbrev != following-sibling::titleabbrev">
+          <xsl:call-template name="emit-message">
+          <xsl:with-param name="message">
+            <xsl:text>Check </xsl:text>
+            <xsl:value-of select="name(..)"/>
+            <xsl:text> titleabbrev.</xsl:text>
+          </xsl:with-param>
+        </xsl:call-template>
+        </xsl:if>
+        <xsl:apply-templates select="titleabbrev" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="titleabbrev">
+        <xsl:apply-templates select="titleabbrev" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="following-sibling::titleabbrev">
+        <xsl:apply-templates select="following-sibling::titleabbrev" mode="copy"/>
+      </xsl:when>
+    </xsl:choose>
+
+    <xsl:choose>
+      <xsl:when test="subtitle and following-sibling::subtitle">
+        <xsl:if test="subtitle != following-sibling::subtitle">
+          <xsl:call-template name="emit-message">
+            <xsl:with-param name="message">
+              <xsl:text>Check </xsl:text>
+              <xsl:value-of select="name(..)"/>
+              <xsl:text> subtitle.</xsl:text>
+            </xsl:with-param>
+          </xsl:call-template>
+        </xsl:if>
+        <xsl:apply-templates select="subtitle" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="subtitle">
+        <xsl:apply-templates select="subtitle" mode="copy"/>
+      </xsl:when>
+      <xsl:when test="following-sibling::subtitle">
+        <xsl:apply-templates select="following-sibling::subtitle" mode="copy"/>
+      </xsl:when>
+    </xsl:choose>
+
+    <xsl:apply-templates/>
+  </info>
+</xsl:template>
+
+<xsl:template match="refentryinfo"
+              priority="200">
+  <info>
+    <xsl:call-template name="copy.attributes"/>
+
+    <!-- titles can be inside or outside or both. fix that -->
+    <xsl:if test="title">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Discarding title from refentryinfo!</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+    </xsl:if>
+
+    <xsl:if test="titleabbrev">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Discarding titleabbrev from refentryinfo!</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+    </xsl:if>
+
+    <xsl:if test="subtitle">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Discarding subtitle from refentryinfo!</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+    </xsl:if>
+
+    <xsl:apply-templates/>
+  </info>
+</xsl:template>
+
+<xsl:template match="refmiscinfo"
+              priority="200">
+  <refmiscinfo>
+    <xsl:call-template name="copy.attributes">
+      <xsl:with-param name="suppress" select="'class'"/>
+    </xsl:call-template>
+    <xsl:if test="@class">
+      <xsl:choose>
+       <xsl:when test="@class = 'source'
+                       or @class = 'version'
+                       or @class = 'manual'
+                       or @class = 'sectdesc'
+                       or @class = 'software'">
+         <xsl:attribute name="class">
+           <xsl:value-of select="@class"/>
+         </xsl:attribute>
+       </xsl:when>
+       <xsl:otherwise>
+         <xsl:attribute name="class">
+           <xsl:value-of select="'other'"/>
+         </xsl:attribute>
+         <xsl:attribute name="otherclass">
+           <xsl:value-of select="@class"/>
+         </xsl:attribute>
+       </xsl:otherwise>
+      </xsl:choose>
+    </xsl:if>
+    <xsl:apply-templates/>
+  </refmiscinfo>
+</xsl:template>
+
+<xsl:template match="corpauthor" priority="200">
+  <author>
+    <xsl:call-template name="copy.attributes"/>
+    <orgname>
+      <xsl:apply-templates/>
+    </orgname>
+  </author>
+</xsl:template>
+
+<xsl:template match="corpname" priority="200">
+  <orgname>
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </orgname>
+</xsl:template>
+
+<xsl:template match="author[not(personname)]|editor[not(personname)]|othercredit[not(personname)]" priority="200">
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes"/>
+    <personname>
+      <xsl:apply-templates select="honorific|firstname|surname|othername|lineage"/>
+    </personname>
+    <xsl:apply-templates select="*[not(self::honorific|self::firstname|self::surname
+                                   |self::othername|self::lineage)]"/>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="address|programlisting|screen|funcsynopsisinfo
+                     |classsynopsisinfo|literallayout" priority="200">
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes">
+      <xsl:with-param name="suppress" select="'format'"/>
+    </xsl:call-template>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="productname[@class]" priority="200">
+  <xsl:call-template name="emit-message">
+    <xsl:with-param name="message">
+      <xsl:text>Dropping class attribute from productname</xsl:text>
+    </xsl:with-param>
+  </xsl:call-template>
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes">
+      <xsl:with-param name="suppress" select="'class'"/>
+    </xsl:call-template>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="dedication|preface|chapter|appendix|part|partintro
+                     |article|bibliography|glossary|glossdiv|index
+                    |reference[not(referenceinfo)]
+                     |book" priority="200">
+  <xsl:choose>
+    <xsl:when test="not(dedicationinfo|prefaceinfo|chapterinfo
+                       |appendixinfo|partinfo
+                        |articleinfo|artheader|bibliographyinfo
+                       |glossaryinfo|indexinfo
+                        |bookinfo)">
+      <xsl:copy>
+        <xsl:call-template name="copy.attributes"/>
+        <xsl:if test="title|subtitle|titleabbrev">
+          <info>
+            <xsl:apply-templates select="title" mode="copy"/>
+            <xsl:apply-templates select="titleabbrev" mode="copy"/>
+            <xsl:apply-templates select="subtitle" mode="copy"/>
+            <xsl:apply-templates select="abstract" mode="copy"/>
+          </info>
+        </xsl:if>
+        <xsl:apply-templates/>
+      </xsl:copy>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:copy>
+        <xsl:call-template name="copy.attributes"/>
+        <xsl:apply-templates/>
+      </xsl:copy>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="formalpara|figure|table[tgroup]|example|blockquote
+                     |caution|important|note|warning|tip
+                     |bibliodiv|glossarydiv|indexdiv
+                    |orderedlist|itemizedlist|variablelist|procedure
+                    |task|tasksummary|taskprerequisites|taskrelated
+                    |sidebar"
+             priority="200">
+  <xsl:choose>
+    <xsl:when test="blockinfo">
+      <xsl:copy>
+        <xsl:call-template name="copy.attributes"/>
+        <xsl:apply-templates/>
+      </xsl:copy>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:copy>
+        <xsl:call-template name="copy.attributes"/>
+
+       <xsl:if test="title|titleabbrev|subtitle">
+         <info>
+           <xsl:apply-templates select="title" mode="copy"/>
+           <xsl:apply-templates select="titleabbrev" mode="copy"/>
+           <xsl:apply-templates select="subtitle" mode="copy"/>
+         </info>
+       </xsl:if>
+
+        <xsl:apply-templates/>
+      </xsl:copy>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="equation" priority="200">
+  <xsl:choose>
+    <xsl:when test="not(title)">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param
+            name="message"
+            >Convert equation without title to informal equation.</xsl:with-param>
+      </xsl:call-template>
+      <informalequation>
+        <xsl:call-template name="copy.attributes"/>
+        <xsl:apply-templates/>
+      </informalequation>
+    </xsl:when>
+    <xsl:when test="blockinfo">
+      <xsl:copy>
+        <xsl:call-template name="copy.attributes"/>
+        <xsl:apply-templates/>
+      </xsl:copy>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:copy>
+        <xsl:call-template name="copy.attributes"/>
+        <info>
+          <xsl:apply-templates select="title" mode="copy"/>
+          <xsl:apply-templates select="titleabbrev" mode="copy"/>
+          <xsl:apply-templates select="subtitle" mode="copy"/>
+        </info>
+        <xsl:apply-templates/>
+      </xsl:copy>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section"
+             priority="200">
+  <section>
+    <xsl:call-template name="copy.attributes"/>
+
+    <xsl:if test="not(sect1info|sect2info|sect3info|sect4info|sect5info|sectioninfo)">
+      <info>
+        <xsl:apply-templates select="title" mode="copy"/>
+        <xsl:apply-templates select="titleabbrev" mode="copy"/>
+        <xsl:apply-templates select="subtitle" mode="copy"/>
+        <xsl:apply-templates select="abstract" mode="copy"/>
+      </info>
+    </xsl:if>
+    <xsl:apply-templates/>
+  </section>
+</xsl:template>
+
+<xsl:template match="simplesect"
+             priority="200">
+  <simplesect>
+    <xsl:call-template name="copy.attributes"/>
+    <info>
+      <xsl:apply-templates select="title" mode="copy"/>
+      <xsl:apply-templates select="titleabbrev" mode="copy"/>
+      <xsl:apply-templates select="subtitle" mode="copy"/>
+      <xsl:apply-templates select="abstract" mode="copy"/>
+    </info>
+    <xsl:apply-templates/>
+  </simplesect>
+</xsl:template>
+
+<xsl:template match="refsect1|refsect2|refsect3|refsection" priority="200">
+  <refsection>
+    <xsl:call-template name="copy.attributes"/>
+
+    <xsl:if test="not(refsect1info|refsect2info|refsect3info|refsectioninfo)">
+      <info>
+        <xsl:apply-templates select="title" mode="copy"/>
+        <xsl:apply-templates select="titleabbrev" mode="copy"/>
+        <xsl:apply-templates select="subtitle" mode="copy"/>
+        <xsl:apply-templates select="abstract" mode="copy"/>
+      </info>
+    </xsl:if>
+    <xsl:apply-templates/>
+  </refsection>
+</xsl:template>
+
+<xsl:template match="imagedata|videodata|audiodata|textdata" priority="200">
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes">
+      <xsl:with-param name="suppress" select="'srccredit'"/>
+    </xsl:call-template>
+    <xsl:if test="@srccredit">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Check conversion of srccredit </xsl:text>
+          <xsl:text>(othercredit="srccredit").</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+      <info>
+        <othercredit class="other" otherclass="srccredit">
+          <orgname>???</orgname>
+          <contrib>
+            <xsl:value-of select="@srccredit"/>
+          </contrib>
+        </othercredit>
+      </info>
+    </xsl:if>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="sgmltag" priority="200">
+  <tag>
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:if test="@class = 'sgmlcomment'">
+      <xsl:attribute name="class">comment</xsl:attribute>
+    </xsl:if>
+    <xsl:apply-templates/>
+  </tag>
+</xsl:template>
+
+<xsl:template match="inlinegraphic[@format='linespecific']" priority="210">
+  <textobject>
+    <textdata>
+      <xsl:call-template name="copy.attributes"/>
+    </textdata>
+  </textobject>
+</xsl:template>
+
+<xsl:template match="inlinegraphic" priority="200">
+  <inlinemediaobject>
+    <imageobject>
+      <imagedata>
+       <xsl:call-template name="copy.attributes"/>
+      </imagedata>
+    </imageobject>
+  </inlinemediaobject>
+</xsl:template>
+
+<xsl:template match="graphic[@format='linespecific']" priority="210">
+  <mediaobject>
+    <textobject>
+      <textdata>
+       <xsl:call-template name="copy.attributes"/>
+      </textdata>
+    </textobject>
+  </mediaobject>
+</xsl:template>
+
+<xsl:template match="graphic" priority="200">
+  <mediaobject>
+    <imageobject>
+      <imagedata>
+       <xsl:call-template name="copy.attributes"/>
+      </imagedata>
+    </imageobject>
+  </mediaobject>
+</xsl:template>
+
+<xsl:template match="pubsnumber" priority="200">
+  <biblioid class="pubsnumber">
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </biblioid>
+</xsl:template>
+
+<xsl:template match="invpartnumber" priority="200">
+  <xsl:call-template name="emit-message">
+    <xsl:with-param name="message">
+      <xsl:text>Converting invpartnumber to biblioid otherclass="invpartnumber".</xsl:text>
+    </xsl:with-param>
+  </xsl:call-template>
+  <biblioid class="other" otherclass="invpartnumber">
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </biblioid>
+</xsl:template>
+
+<xsl:template match="contractsponsor" priority="200">
+  <xsl:variable name="contractnum"
+                select="preceding-sibling::contractnum|following-sibling::contractnum"/>
+
+  <xsl:call-template name="emit-message">
+    <xsl:with-param name="message">
+      <xsl:text>Converting contractsponsor to othercredit="contractsponsor".</xsl:text>
+    </xsl:with-param>
+  </xsl:call-template>
+
+  <othercredit class="other" otherclass="contractsponsor">
+    <orgname>
+      <xsl:call-template name="copy.attributes"/>
+      <xsl:apply-templates/>
+    </orgname>
+    <xsl:for-each select="$contractnum">
+      <contrib role="contractnum">
+        <xsl:apply-templates select="node()"/>
+      </contrib>
+    </xsl:for-each>
+  </othercredit>
+</xsl:template>
+
+<xsl:template match="contractnum" priority="200">
+  <xsl:if test="not(preceding-sibling::contractsponsor
+                    |following-sibling::contractsponsor)
+                and not(preceding-sibling::contractnum)">
+    <xsl:call-template name="emit-message">
+      <xsl:with-param name="message">
+        <xsl:text>Converting contractnum to othercredit="contractnum".</xsl:text>
+      </xsl:with-param>
+    </xsl:call-template>
+
+    <othercredit class="other" otherclass="contractnum">
+      <orgname>???</orgname>
+      <xsl:for-each select="self::contractnum
+                            |preceding-sibling::contractnum
+                            |following-sibling::contractnum">
+        <contrib>
+          <xsl:apply-templates select="node()"/>
+        </contrib>
+      </xsl:for-each>
+    </othercredit>
+  </xsl:if>
+</xsl:template>
+
+<xsl:template match="isbn|issn" priority="200">
+  <biblioid class="{local-name(.)}">
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </biblioid>
+</xsl:template>
+
+<xsl:template match="biblioid[count(*) = 1
+                             and ulink
+                             and normalize-space(text()) = '']" priority="200">
+  <biblioid xlink:href="{ulink/@url}">
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates select="ulink/node()"/>
+  </biblioid>
+</xsl:template>
+
+<xsl:template match="authorblurb" priority="200">
+  <personblurb>
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </personblurb>
+</xsl:template>
+
+<xsl:template match="collabname" priority="200">
+  <xsl:call-template name="emit-message">
+    <xsl:with-param name="message">
+      <xsl:text>Check conversion of collabname </xsl:text>
+      <xsl:text>(orgname role="collabname").</xsl:text>
+    </xsl:with-param>
+  </xsl:call-template>
+  <orgname role="collabname">
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </orgname>
+</xsl:template>
+
+<xsl:template match="modespec" priority="200">
+  <xsl:call-template name="emit-message">
+    <xsl:with-param name="message">
+      <xsl:text>Discarding modespec (</xsl:text>
+      <xsl:value-of select="."/>
+      <xsl:text>).</xsl:text>
+    </xsl:with-param>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="mediaobjectco" priority="200">
+  <mediaobject>
+    <xsl:copy-of select="@*"/>
+    <xsl:apply-templates/>
+  </mediaobject>
+</xsl:template>
+
+<xsl:template match="remark" priority="200">
+  <!-- get rid of any embedded markup -->
+  <remark>
+    <xsl:copy-of select="@*"/>
+    <xsl:value-of select="."/>
+  </remark>
+</xsl:template>
+
+<xsl:template match="biblioentry/title
+                     |bibliomset/title
+                     |biblioset/title
+                     |bibliomixed/title" priority="400">
+  <citetitle>
+    <xsl:copy-of select="@*"/>
+    <xsl:apply-templates/>
+  </citetitle>
+</xsl:template>
+
+<xsl:template match="biblioentry/titleabbrev|biblioentry/subtitle
+                     |bibliomset/titleabbrev|bibliomset/subtitle
+                     |biblioset/titleabbrev|biblioset/subtitle
+                     |bibliomixed/titleabbrev|bibliomixed/subtitle"
+             priority="400">
+  <xsl:copy>
+    <xsl:copy-of select="@*"/>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="biblioentry/contrib
+                     |bibliomset/contrib
+                     |bibliomixed/contrib" priority="200">
+  <xsl:call-template name="emit-message">
+    <xsl:with-param name="message">
+      <xsl:text>Check conversion of contrib </xsl:text>
+      <xsl:text>(othercontrib="contrib").</xsl:text>
+    </xsl:with-param>
+  </xsl:call-template>
+  <othercredit class="other" otherclass="contrib">
+    <orgname>???</orgname>
+    <contrib>
+      <xsl:call-template name="copy.attributes"/>
+      <xsl:apply-templates/>
+    </contrib>
+  </othercredit>
+</xsl:template>
+
+<xsl:template match="link" priority="200">
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="ulink" priority="200">
+  <xsl:choose>
+    <xsl:when test="node()">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Converting ulink to link.</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+
+      <link xlink:href="{@url}">
+       <xsl:call-template name="copy.attributes">
+         <xsl:with-param name="suppress" select="'url'"/>
+       </xsl:call-template>
+       <xsl:apply-templates/>
+      </link>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Converting ulink to uri.</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+
+      <uri xlink:href="{@url}">
+       <xsl:call-template name="copy.attributes">
+         <xsl:with-param name="suppress" select="'url'"/>
+       </xsl:call-template>
+       <xsl:value-of select="@url"/>
+      </uri>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="olink" priority="200">
+  <xsl:if test="@linkmode">
+    <xsl:call-template name="emit-message">
+      <xsl:with-param name="message">
+        <xsl:text>Discarding linkmode on olink.</xsl:text>
+      </xsl:with-param>
+    </xsl:call-template>
+  </xsl:if>
+
+  <xsl:choose>
+    <xsl:when test="@targetdocent">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Converting olink targetdocent to targetdoc.</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+
+      <olink targetdoc="{unparsed-entity-uri(@targetdocent)}">
+       <xsl:for-each select="@*">
+         <xsl:if test="name(.) != 'targetdocent'
+                       and name(.) != 'linkmode'">
+           <xsl:copy/>
+         </xsl:if>
+       </xsl:for-each>
+       <xsl:apply-templates/>
+      </olink>
+    </xsl:when>
+    <xsl:otherwise>
+      <olink>
+       <xsl:for-each select="@*">
+         <xsl:if test="name(.) != 'linkmode'">
+           <xsl:copy/>
+         </xsl:if>
+       </xsl:for-each>
+       <xsl:apply-templates/>
+      </olink>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="biblioentry/firstname
+                     |biblioentry/surname
+                     |biblioentry/othername
+                     |biblioentry/lineage
+                     |biblioentry/honorific
+                     |bibliomset/firstname
+                     |bibliomset/surname
+                     |bibliomset/othername
+                     |bibliomset/lineage
+                     |bibliomset/honorific" priority="200">
+  <xsl:choose>
+    <xsl:when test="preceding-sibling::firstname
+                    |preceding-sibling::surname
+                    |preceding-sibling::othername
+                    |preceding-sibling::lineage
+                    |preceding-sibling::honorific">
+      <!-- nop -->
+    </xsl:when>
+    <xsl:otherwise>
+      <personname>
+        <xsl:apply-templates select="../firstname
+                                     |../surname
+                                     |../othername
+                                     |../lineage
+                                     |../honorific" mode="copy"/>
+      </personname>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="areaset" priority="200">
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes">
+      <xsl:with-param name="suppress" select="'coords'"/>
+    </xsl:call-template>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="date|pubdate" priority="200">
+  <xsl:variable name="rp1" select="substring-before(normalize-space(.), ' ')"/>
+  <xsl:variable name="rp2"
+               select="substring-before(substring-after(normalize-space(.), ' '),
+                                        ' ')"/>
+  <xsl:variable name="rp3"
+               select="substring-after(substring-after(normalize-space(.), ' '), ' ')"/>
+
+  <xsl:variable name="p1">
+    <xsl:choose>
+      <xsl:when test="contains($rp1, ',')">
+       <xsl:value-of select="substring-before($rp1, ',')"/>
+      </xsl:when>
+      <xsl:otherwise>
+       <xsl:value-of select="$rp1"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:variable name="p2">
+    <xsl:choose>
+      <xsl:when test="contains($rp2, ',')">
+       <xsl:value-of select="substring-before($rp2, ',')"/>
+      </xsl:when>
+      <xsl:otherwise>
+       <xsl:value-of select="$rp2"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:variable name="p3">
+    <xsl:choose>
+      <xsl:when test="contains($rp3, ',')">
+       <xsl:value-of select="substring-before($rp3, ',')"/>
+      </xsl:when>
+      <xsl:otherwise>
+       <xsl:value-of select="$rp3"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:variable name="date">
+    <xsl:choose>
+      <xsl:when test="string($p1+1) != 'NaN' and string($p3+1) != 'NaN'">
+       <xsl:choose>
+         <xsl:when test="$p2 = 'Jan' or $p2 = 'January'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-01-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Feb' or $p2 = 'February'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-02-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Mar' or $p2 = 'March'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-03-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Apr' or $p2 = 'April'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-04-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'May'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-05-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Jun' or $p2 = 'June'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-06-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Jul' or $p2 = 'July'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-07-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Aug' or $p2 = 'August'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-08-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Sep' or $p2 = 'September'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-09-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Oct' or $p2 = 'October'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-10-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Nov' or $p2 = 'November'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-11-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p2 = 'Dec' or $p2 = 'December'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-12-</xsl:text>
+           <xsl:number value="$p1" format="01"/>
+         </xsl:when>
+         <xsl:otherwise>
+           <xsl:apply-templates/>
+         </xsl:otherwise>
+       </xsl:choose>
+      </xsl:when>
+      <xsl:when test="string($p2+1) != 'NaN' and string($p3+1) != 'NaN'">
+       <xsl:choose>
+         <xsl:when test="$p1 = 'Jan' or $p1 = 'January'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-01-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Feb' or $p1 = 'February'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-02-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Mar' or $p1 = 'March'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-03-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Apr' or $p1 = 'April'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-04-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'May'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-05-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Jun' or $p1 = 'June'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-06-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Jul' or $p1 = 'July'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-07-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Aug' or $p1 = 'August'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-08-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Sep' or $p1 = 'September'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-09-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Oct' or $p1 = 'October'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-10-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Nov' or $p1 = 'November'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-11-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:when test="$p1 = 'Dec' or $p1 = 'December'">
+           <xsl:number value="$p3" format="0001"/>
+           <xsl:text>-12-</xsl:text>
+           <xsl:number value="$p2" format="01"/>
+         </xsl:when>
+         <xsl:otherwise>
+           <xsl:apply-templates/>
+         </xsl:otherwise>
+       </xsl:choose>
+      </xsl:when>
+      <xsl:otherwise>
+       <xsl:apply-templates/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:choose>
+    <xsl:when test="normalize-space($date) != normalize-space(.)">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Converted </xsl:text>
+          <xsl:value-of select="normalize-space(.)"/>
+          <xsl:text> into </xsl:text>
+          <xsl:value-of select="$date"/>
+          <xsl:text> for </xsl:text>
+          <xsl:value-of select="name(.)"/>
+        </xsl:with-param>
+      </xsl:call-template>
+
+      <xsl:copy>
+       <xsl:copy-of select="@*"/>
+       <xsl:value-of select="$date"/>
+      </xsl:copy>
+    </xsl:when>
+
+    <xsl:when test="$defaultDate != ''">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Unparseable date: </xsl:text>
+          <xsl:value-of select="normalize-space(.)"/>
+          <xsl:text> in </xsl:text>
+          <xsl:value-of select="name(.)"/>
+          <xsl:text> (Using default: </xsl:text>
+          <xsl:value-of select="$defaultDate"/>
+          <xsl:text>)</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+
+      <xsl:copy>
+       <xsl:copy-of select="@*"/>
+       <xsl:copy-of select="$defaultDate"/>
+       <xsl:comment>
+         <xsl:value-of select="."/>
+       </xsl:comment>
+      </xsl:copy>
+    </xsl:when>
+
+    <xsl:otherwise>
+      <!-- these don't really matter anymore
+           <xsl:call-template name="emit-message">
+           <xsl:with-param name="message">
+           <xsl:text>Unparseable date: </xsl:text>
+           <xsl:value-of select="normalize-space(.)"/>
+           <xsl:text> in </xsl:text>
+           <xsl:value-of select="name(.)"/>
+           </xsl:with-param>
+           </xsl:call-template>
+      -->
+      <xsl:copy>
+       <xsl:copy-of select="@*"/>
+       <xsl:apply-templates/>
+      </xsl:copy>
+    </xsl:otherwise>
+  </xsl:choose>      
+</xsl:template>
+
+<xsl:template match="title|subtitle|titleabbrev" priority="300">
+  <!-- nop -->
+</xsl:template>
+
+<xsl:template match="abstract" priority="300">
+  <xsl:if test="not(contains(name(parent::*),'info'))">
+    <xsl:call-template name="emit-message">
+      <xsl:with-param name="message">
+       <xsl:text>Check abstract; moved into info correctly?</xsl:text>
+      </xsl:with-param>
+    </xsl:call-template>
+  </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm">
+  <!-- don't copy the defaulted significance='normal' attribute -->
+  <indexterm>
+    <xsl:call-template name="copy.attributes">
+      <xsl:with-param name="suppress">
+       <xsl:if test="@significance = 'normal'">significance</xsl:if>
+      </xsl:with-param>
+    </xsl:call-template>
+    <xsl:apply-templates/>
+  </indexterm>
+</xsl:template>
+
+<xsl:template match="ackno" priority="200">
+  <acknowledgements>
+    <xsl:copy-of select="@*"/>
+    <para>
+      <xsl:apply-templates/>
+    </para>
+  </acknowledgements>
+</xsl:template>
+
+<xsl:template match="lot|lotentry|tocback|tocchap|tocfront|toclevel1|
+                    toclevel2|toclevel3|toclevel4|toclevel5|tocpart" priority="200">
+  <tocdiv>
+    <xsl:copy-of select="@*"/>
+    <xsl:apply-templates/>
+  </tocdiv>
+</xsl:template>
+
+<xsl:template match="action" priority="200">
+  <phrase remap="action">
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </phrase>
+</xsl:template>
+
+<xsl:template match="beginpage" priority="200">
+  <xsl:comment> beginpage pagenum=<xsl:value-of select="@pagenum"/> </xsl:comment>
+  <xsl:call-template name="emit-message">
+    <xsl:with-param name="message">
+      <xsl:text>Replacing beginpage with comment</xsl:text>
+    </xsl:with-param>
+  </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="structname|structfield" priority="200">
+  <varname remap="{local-name(.)}">
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </varname>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<!-- 6 Feb 2008, ndw changed mode=copy so that it only copies the first level,
+     then it switches back to "normal" mode so that other rewriting templates
+     catch embedded fixes -->
+
+<!--
+<xsl:template match="ulink" priority="200" mode="copy">
+  <xsl:choose>
+    <xsl:when test="node()">
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Converting ulink to phrase.</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+
+      <phrase xlink:href="{@url}">
+       <xsl:call-template name="copy.attributes">
+         <xsl:with-param name="suppress" select="'url'"/>
+       </xsl:call-template>
+       <xsl:apply-templates/>
+      </phrase>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:call-template name="emit-message">
+        <xsl:with-param name="message">
+          <xsl:text>Converting ulink to uri.</xsl:text>
+        </xsl:with-param>
+      </xsl:call-template>
+
+      <uri xlink:href="{@url}">
+       <xsl:call-template name="copy.attributes">
+         <xsl:with-param name="suppress" select="'url'"/>
+       </xsl:call-template>
+       <xsl:value-of select="@url"/>
+      </uri>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sgmltag" priority="200" mode="copy">
+  <tag>
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </tag>
+</xsl:template>
+-->
+
+<xsl:template match="*" mode="copy">
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+<!--
+<xsl:template match="comment()|processing-instruction()|text()" mode="copy">
+  <xsl:copy/>
+</xsl:template>
+-->
+
+<!-- ====================================================================== -->
+
+<xsl:template match="*">
+  <xsl:copy>
+    <xsl:call-template name="copy.attributes"/>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+<xsl:template match="comment()|processing-instruction()|text()">
+  <xsl:copy/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="copy.attributes">
+  <xsl:param name="src" select="."/>
+  <xsl:param name="suppress" select="''"/>
+
+  <xsl:for-each select="$src/@*">
+    <xsl:choose>
+      <xsl:when test="local-name(.) = 'moreinfo'">
+        <xsl:call-template name="emit-message">
+          <xsl:with-param name="message">
+            <xsl:text>Discarding moreinfo on </xsl:text>
+            <xsl:value-of select="local-name($src)"/>
+          </xsl:with-param>
+        </xsl:call-template>
+      </xsl:when>
+      <xsl:when test="local-name(.) = 'lang'">
+        <xsl:attribute name="xml:lang">
+          <xsl:value-of select="."/>
+        </xsl:attribute>
+      </xsl:when>
+      <xsl:when test="local-name(.) = 'id'">
+        <xsl:attribute name="xml:id">
+          <xsl:value-of select="."/>
+        </xsl:attribute>
+      </xsl:when>
+      <xsl:when test="$suppress = local-name(.)"/>
+      <xsl:when test="local-name(.) = 'float'">
+       <xsl:choose>
+         <xsl:when test=". = '1'">
+            <xsl:call-template name="emit-message">
+              <xsl:with-param name="message">
+                <xsl:text>Discarding float on </xsl:text>
+                <xsl:value-of select="local-name($src)"/>
+              </xsl:with-param>
+            </xsl:call-template>
+            <xsl:if test="not($src/@floatstyle)">
+             <xsl:call-template name="emit-message">
+                <xsl:with-param name="message">
+                  <xsl:text>Adding floatstyle='normal' on </xsl:text>
+                  <xsl:value-of select="local-name($src)"/>
+                </xsl:with-param>
+              </xsl:call-template>
+              <xsl:attribute name="floatstyle">
+                <xsl:text>normal</xsl:text>
+             </xsl:attribute>
+           </xsl:if>
+         </xsl:when>
+         <xsl:when test=". = '0'">
+           <xsl:call-template name="emit-message">
+              <xsl:with-param name="message">
+                <xsl:text>Discarding float on </xsl:text>
+                <xsl:value-of select="local-name($src)"/>
+              </xsl:with-param>
+            </xsl:call-template>
+          </xsl:when>
+         <xsl:otherwise>
+           <xsl:call-template name="emit-message">
+          <xsl:with-param name="message">
+            <xsl:text>Discarding float on </xsl:text>
+            <xsl:value-of select="local-name($src)"/>
+          </xsl:with-param>
+            </xsl:call-template>
+            <xsl:if test="not($src/@floatstyle)">
+              <xsl:call-template name="emit-message">
+                <xsl:with-param name="message">
+                  <xsl:text>Adding floatstyle='</xsl:text>
+                  <xsl:value-of select="."/>
+                  <xsl:text>' on </xsl:text>
+                  <xsl:value-of select="local-name($src)"/>
+                </xsl:with-param>
+              </xsl:call-template>
+              <xsl:attribute name="floatstyle">
+               <xsl:value-of select="."/>
+             </xsl:attribute>
+           </xsl:if>
+         </xsl:otherwise>
+       </xsl:choose>
+      </xsl:when>
+      <xsl:when test="local-name(.) = 'entityref'">
+       <xsl:attribute name="fileref">
+         <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+       </xsl:attribute>
+      </xsl:when>
+
+      <xsl:when test="local-name($src) = 'simplemsgentry'
+                     and local-name(.) = 'audience'">
+        <xsl:attribute name="msgaud">
+          <xsl:value-of select="."/>
+        </xsl:attribute>
+      </xsl:when>
+      <xsl:when test="local-name($src) = 'simplemsgentry'
+                     and local-name(.) = 'origin'">
+        <xsl:attribute name="msgorig">
+          <xsl:value-of select="."/>
+        </xsl:attribute>
+      </xsl:when>
+      <xsl:when test="local-name($src) = 'simplemsgentry'
+                     and local-name(.) = 'level'">
+        <xsl:attribute name="msglevel">
+          <xsl:value-of select="."/>
+        </xsl:attribute>
+      </xsl:when>
+
+      <!-- * for upgrading XSL litprog params documentation -->
+      <xsl:when test="local-name($src) = 'refmiscinfo'
+                      and local-name(.) = 'role'
+                      and . = 'type'
+                      ">
+        <xsl:call-template name="emit-message">
+          <xsl:with-param name="message">
+            <xsl:text>Converting refmiscinfo@role=type to </xsl:text>
+            <xsl:text>@class=other,otherclass=type</xsl:text>
+          </xsl:with-param>
+        </xsl:call-template>
+        <xsl:attribute name="class">other</xsl:attribute>
+        <xsl:attribute name="otherclass">type</xsl:attribute>
+      </xsl:when>
+
+      <xsl:otherwise>
+        <xsl:copy/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:for-each>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="*" mode="addNS">
+  <xsl:choose>
+    <xsl:when test="namespace-uri(.) = ''">
+      <xsl:element name="{local-name(.)}"
+                  namespace="http://docbook.org/ns/docbook">
+       <xsl:if test="not(parent::*)">
+         <xsl:attribute name="version">5.0</xsl:attribute>
+       </xsl:if>
+       <xsl:copy-of select="@*"/>
+       <xsl:apply-templates mode="addNS"/>
+      </xsl:element>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:copy>
+       <xsl:if test="not(parent::*)">
+         <xsl:attribute name="version">5.0</xsl:attribute>
+       </xsl:if>
+       <xsl:copy-of select="@*"/>
+       <xsl:apply-templates mode="addNS"/>
+      </xsl:copy>
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template>
+
+<xsl:template match="comment()|processing-instruction()|text()" mode="addNS">
+  <xsl:copy/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="emit-message">
+  <xsl:param name="message"/>
+  <xsl:message>
+    <xsl:value-of select="$message"/>
+    <xsl:text> (</xsl:text>
+    <xsl:value-of select="$rootid"/>
+    <xsl:text>)</xsl:text>
+  </xsl:message>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/docbook-full.cnd b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/docbook-full.cnd
new file mode 100644 (file)
index 0000000..79c3882
--- /dev/null
@@ -0,0 +1,2998 @@
+<dbk = 'http://docbook.org/ns/docbook'>
+<argeodbk = 'http://www.argeo.org/ns/argeodbk'>
+<xlink = 'http://www.w3.org/1999/xlink'>
+//<xs = 'http://www.w3.org/2001/XMLSchema'>
+
+[argeodbk:titled]
+mixin
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:title (dbk:title) = dbk:title *
+ + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
+
+[argeodbk:linkingAttributes]
+mixin
+ - linkend (String)
+ - xlink:actuate (String)
+ - xlink:arcrole (String)
+ - xlink:href (String)
+ - xlink:role (String)
+ - xlink:show (String)
+ - xlink:title (String)
+ - xlink:type (String)
+
+[argeodbk:freeText]
+mixin
+ + dbk:phrase (dbk:phrase) = dbk:phrase *
+ + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[argeodbk:markupInlines]
+mixin
+ + dbk:code (dbk:code) = dbk:code *
+ + dbk:constant (dbk:constant) = dbk:constant *
+ + dbk:email (dbk:email) = dbk:email *
+ + dbk:literal (dbk:literal) = dbk:literal *
+ + dbk:markup (dbk:markup) = dbk:markup *
+ + dbk:symbol (dbk:symbol) = dbk:symbol *
+ + dbk:tag (dbk:tag) = dbk:tag *
+ + dbk:token (dbk:token) = dbk:token *
+ + dbk:uri (dbk:uri) = dbk:uri *
+
+[argeodbk:listElements]
+mixin
+ + dbk:bibliolist (dbk:bibliolist) = dbk:bibliolist *
+ + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
+ + dbk:glosslist (dbk:glosslist) = dbk:glosslist *
+ + dbk:itemizedlist (dbk:itemizedlist) = dbk:itemizedlist *
+ + dbk:orderedlist (dbk:orderedlist) = dbk:orderedlist *
+ + dbk:procedure (dbk:procedure) = dbk:procedure *
+ + dbk:qandaset (dbk:qandaset) = dbk:qandaset *
+ + dbk:segmentedlist (dbk:segmentedlist) = dbk:segmentedlist *
+ + dbk:simplelist (dbk:simplelist) = dbk:simplelist *
+ + dbk:variablelist (dbk:variablelist) = dbk:variablelist *
+
+[argeodbk:paragraphElements]
+mixin
+ + dbk:formalpara (dbk:formalpara) = dbk:formalpara *
+ + dbk:para (dbk:para) = dbk:para *
+ + dbk:simpara (dbk:simpara) = dbk:simpara *
+
+[argeodbk:indexingInlines]
+mixin
+ + dbk:indexterm (dbk:indexterm) = dbk:indexterm *
+
+[argeodbk:techDocElements]
+mixin
+ + dbk:caution (dbk:caution) = dbk:caution *
+ + dbk:classsynopsis (dbk:classsynopsis) = dbk:classsynopsis *
+ + dbk:cmdsynopsis (dbk:cmdsynopsis) = dbk:cmdsynopsis *
+ + dbk:constraintdef (dbk:constraintdef) = dbk:constraintdef *
+ + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis *
+ + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis *
+ + dbk:equation (dbk:equation) = dbk:equation *
+ + dbk:example (dbk:example) = dbk:example *
+ + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis *
+ + dbk:figure (dbk:figure) = dbk:figure *
+ + dbk:funcsynopsis (dbk:funcsynopsis) = dbk:funcsynopsis *
+ + dbk:important (dbk:important) = dbk:important *
+ + dbk:informalequation (dbk:informalequation) = dbk:informalequation *
+ + dbk:informalexample (dbk:informalexample) = dbk:informalexample *
+ + dbk:informalfigure (dbk:informalfigure) = dbk:informalfigure *
+ + dbk:informaltable (dbk:informaltable) = dbk:informaltable *
+ + dbk:literallayout (dbk:literallayout) = dbk:literallayout *
+ + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis *
+ + dbk:msgset (dbk:msgset) = dbk:msgset *
+ + dbk:note (dbk:note) = dbk:note *
+ + dbk:productionset (dbk:productionset) = dbk:productionset *
+ + dbk:programlisting (dbk:programlisting) = dbk:programlisting *
+ + dbk:programlistingco (dbk:programlistingco) = dbk:programlistingco *
+ + dbk:screen (dbk:screen) = dbk:screen *
+ + dbk:screenco (dbk:screenco) = dbk:screenco *
+ + dbk:synopsis (dbk:synopsis) = dbk:synopsis *
+ + dbk:table (dbk:table) = dbk:table *
+ + dbk:task (dbk:task) = dbk:task *
+ + dbk:tip (dbk:tip) = dbk:tip *
+ + dbk:warning (dbk:warning) = dbk:warning *
+
+[argeodbk:techDocInlines]
+mixin
+ + dbk:accel (dbk:accel) = dbk:accel *
+ + dbk:application (dbk:application) = dbk:application *
+ + dbk:classname (dbk:classname) = dbk:classname *
+ + dbk:command (dbk:command) = dbk:command *
+ + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput *
+ + dbk:database (dbk:database) = dbk:database *
+ + dbk:envar (dbk:envar) = dbk:envar *
+ + dbk:errorcode (dbk:errorcode) = dbk:errorcode *
+ + dbk:errorname (dbk:errorname) = dbk:errorname *
+ + dbk:errortext (dbk:errortext) = dbk:errortext *
+ + dbk:errortype (dbk:errortype) = dbk:errortype *
+ + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
+ + dbk:filename (dbk:filename) = dbk:filename *
+ + dbk:function (dbk:function) = dbk:function *
+ + dbk:guibutton (dbk:guibutton) = dbk:guibutton *
+ + dbk:guiicon (dbk:guiicon) = dbk:guiicon *
+ + dbk:guilabel (dbk:guilabel) = dbk:guilabel *
+ + dbk:guimenu (dbk:guimenu) = dbk:guimenu *
+ + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem *
+ + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu *
+ + dbk:hardware (dbk:hardware) = dbk:hardware *
+ + dbk:initializer (dbk:initializer) = dbk:initializer *
+ + dbk:inlineequation (dbk:inlineequation) = dbk:inlineequation *
+ + dbk:interfacename (dbk:interfacename) = dbk:interfacename *
+ + dbk:keycap (dbk:keycap) = dbk:keycap *
+ + dbk:keycode (dbk:keycode) = dbk:keycode *
+ + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
+ + dbk:keysym (dbk:keysym) = dbk:keysym *
+ + dbk:menuchoice (dbk:menuchoice) = dbk:menuchoice *
+ + dbk:methodname (dbk:methodname) = dbk:methodname *
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
+ + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
+ + dbk:ooclass (dbk:ooclass) = dbk:ooclass *
+ + dbk:ooexception (dbk:ooexception) = dbk:ooexception *
+ + dbk:oointerface (dbk:oointerface) = dbk:oointerface *
+ + dbk:option (dbk:option) = dbk:option *
+ + dbk:optional (dbk:optional) = dbk:optional *
+ + dbk:package (dbk:package) = dbk:package *
+ + dbk:parameter (dbk:parameter) = dbk:parameter *
+ + dbk:productname (dbk:productname) = dbk:productname *
+ + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
+ + dbk:prompt (dbk:prompt) = dbk:prompt *
+ + dbk:property (dbk:property) = dbk:property *
+ + dbk:returnvalue (dbk:returnvalue) = dbk:returnvalue *
+ + dbk:shortcut (dbk:shortcut) = dbk:shortcut *
+ + dbk:systemitem (dbk:systemitem) = dbk:systemitem *
+ + dbk:termdef (dbk:termdef) = dbk:termdef *
+ + dbk:trademark (dbk:trademark) = dbk:trademark *
+ + dbk:type (dbk:type) = dbk:type *
+ + dbk:userinput (dbk:userinput) = dbk:userinput *
+ + dbk:varname (dbk:varname) = dbk:varname *
+
+[argeodbk:publishingElements]
+mixin
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:blockquote (dbk:blockquote) = dbk:blockquote *
+ + dbk:epigraph (dbk:epigraph) = dbk:epigraph *
+ + dbk:sidebar (dbk:sidebar) = dbk:sidebar *
+
+[argeodbk:ubiquitousInlines]
+mixin
+ + dbk:alt (dbk:alt) = dbk:alt *
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:biblioref (dbk:biblioref) = dbk:biblioref *
+ + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
+ + dbk:link (dbk:link) = dbk:link *
+ + dbk:olink (dbk:olink) = dbk:olink *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:subscript (dbk:subscript) = dbk:subscript *
+ + dbk:superscript (dbk:superscript) = dbk:superscript *
+ + dbk:xref (dbk:xref) = dbk:xref *
+
+[argeodbk:abstractSection]
+mixin
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bibliography (dbk:bibliography) = dbk:bibliography *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:glossary (dbk:glossary) = dbk:glossary *
+ + dbk:index (dbk:index) = dbk:index *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:toc (dbk:toc) = dbk:toc *
+ - label (String)
+ - status (String)
+
+[argeodbk:bibliographyInlines]
+mixin
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:citation (dbk:citation) = dbk:citation *
+ + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
+ + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
+ + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:jobtitle (dbk:jobtitle) = dbk:jobtitle *
+ + dbk:org (dbk:org) = dbk:org *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:person (dbk:person) = dbk:person *
+ + dbk:personname (dbk:personname) = dbk:personname *
+
+[argeodbk:publishingInlines]
+mixin
+ + dbk:abbrev (dbk:abbrev) = dbk:abbrev *
+ + dbk:acronym (dbk:acronym) = dbk:acronym *
+ + dbk:coref (dbk:coref) = dbk:coref *
+ + dbk:date (dbk:date) = dbk:date *
+ + dbk:emphasis (dbk:emphasis) = dbk:emphasis *
+ + dbk:firstterm (dbk:firstterm) = dbk:firstterm *
+ + dbk:footnote (dbk:footnote) = dbk:footnote *
+ + dbk:footnoteref (dbk:footnoteref) = dbk:footnoteref *
+ + dbk:foreignphrase (dbk:foreignphrase) = dbk:foreignphrase *
+ + dbk:glossterm (dbk:glossterm) = dbk:glossterm *
+ + dbk:quote (dbk:quote) = dbk:quote *
+ + dbk:wordasword (dbk:wordasword) = dbk:wordasword *
+
+[argeodbk:base]
+abstract
+orderable
+ - annotations (String)
+ - arch (String)
+ - audience (String)
+ - condition (String)
+ - conformance (String)
+ - dir (String)
+ - os (String)
+ - remap (String)
+ - revision (String)
+ - revisionflag (String)
+ - role (String)
+ - security (String)
+ - userlevel (String)
+ - vendor (String)
+ - version (String)
+ - wordsize (String)
+ - xreflabel (String)
+
+[dbk:abbrev] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:trademark (dbk:trademark) = dbk:trademark *
+
+[dbk:abstract] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+
+[dbk:accel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:acknowledgements] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:acronym] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:trademark (dbk:trademark) = dbk:trademark *
+
+[dbk:address] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:city (dbk:city) = dbk:city *
+ + dbk:country (dbk:country) = dbk:country *
+ + dbk:email (dbk:email) = dbk:email *
+ + dbk:fax (dbk:fax) = dbk:fax *
+ + dbk:otheraddr (dbk:otheraddr) = dbk:otheraddr *
+ + dbk:personname (dbk:personname) = dbk:personname *
+ + dbk:phone (dbk:phone) = dbk:phone *
+ + dbk:pob (dbk:pob) = dbk:pob *
+ + dbk:postcode (dbk:postcode) = dbk:postcode *
+ + dbk:state (dbk:state) = dbk:state *
+ + dbk:street (dbk:street) = dbk:street *
+ + dbk:uri (dbk:uri) = dbk:uri *
+ - continuation (String) 
+ - language (String) 
+ - linenumbering (String) 
+ - startinglinenumber (String) 
+ - xml:space (String) 
+
+[dbk:affiliation] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:jobtitle (dbk:jobtitle) = dbk:jobtitle *
+ + dbk:org (dbk:org) = dbk:org
+ + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
+ + dbk:orgname (dbk:orgname) = dbk:orgname
+ + dbk:shortaffil (dbk:shortaffil) = dbk:shortaffil
+
+[dbk:alt] > argeodbk:base
+ + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:anchor] > argeodbk:base
+
+[dbk:annotation] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - annotates (String) 
+
+[dbk:answer] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:label (dbk:label) = dbk:label
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:appendix] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect1 (dbk:sect1) = dbk:sect1 *
+ + dbk:section (dbk:section) = dbk:section *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:application] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:arc] > argeodbk:base
+ - xlink:from (String) 
+ - xlink:to (String) 
+
+[dbk:area] > argeodbk:base
+ + dbk:alt (dbk:alt) = dbk:alt
+ - coords (String) 
+ - label (String) 
+ - linkends (String) 
+ - otherunits (String) 
+ - units (String) 
+
+[dbk:areaset] > argeodbk:base
+ + dbk:area (dbk:area) = dbk:area *
+ - label (String) 
+ - linkends (String) 
+ - otherunits (String) 
+ - units (String) 
+
+[dbk:areaspec] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:area (dbk:area) = dbk:area *
+ + dbk:areaset (dbk:areaset) = dbk:areaset *
+ - otherunits (String) 
+ - units (String) 
+
+[dbk:arg] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:arg (dbk:arg) = dbk:arg *
+ + dbk:group (dbk:group) = dbk:group *
+ + dbk:option (dbk:option) = dbk:option *
+ + dbk:sbr (dbk:sbr) = dbk:sbr *
+ + dbk:synopfragmentref (dbk:synopfragmentref) = dbk:synopfragmentref *
+ - choice (String) 
+ - rep (String) 
+
+[dbk:article] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements *
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:appendix (dbk:appendix) = dbk:appendix *
+ + dbk:colophon (dbk:colophon) = dbk:colophon *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect1 (dbk:sect1) = dbk:sect1 *
+ + dbk:section (dbk:section) = dbk:section *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ - class (String) 
+
+[dbk:artpagenums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:attribution] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:citation (dbk:citation) = dbk:citation *
+ + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
+ + dbk:person (dbk:person) = dbk:person *
+ + dbk:personname (dbk:personname) = dbk:personname *
+
+[dbk:audiodata] > argeodbk:base
+ + dbk:info (dbk:info) = dbk:info
+ - entityref (String) 
+ - fileref (String) 
+ - format (String) 
+
+[dbk:audioobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:audiodata (dbk:audiodata) = dbk:audiodata
+ + dbk:info (dbk:info) = dbk:info
+
+[dbk:author] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
+ + dbk:contrib (dbk:contrib) = dbk:contrib *
+ + dbk:email (dbk:email) = dbk:email *
+ + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
+ + dbk:orgname (dbk:orgname) = dbk:orgname
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname
+ + dbk:uri (dbk:uri) = dbk:uri *
+
+[dbk:authorgroup] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
+
+[dbk:authorinitials] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:bibliocoverage] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - otherspatial (String) 
+ - othertemporal (String) 
+ - spatial (String) 
+ - temporal (String) 
+
+[dbk:bibliodiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry *
+ + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:biblioentry] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines
+ + dbk:abstract (dbk:abstract) = dbk:abstract *
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
+ + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
+ + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
+ + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
+ + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
+ + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
+ + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
+ + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
+ + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
+ + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
+ + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
+ + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
+ + dbk:collab (dbk:collab) = dbk:collab *
+ + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
+ + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
+ + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
+ + dbk:copyright (dbk:copyright) = dbk:copyright *
+ + dbk:cover (dbk:cover) = dbk:cover *
+ + dbk:edition (dbk:edition) = dbk:edition *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
+ + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
+ + dbk:itermset (dbk:itermset) = dbk:itermset *
+ + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
+ + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:org (dbk:org) = dbk:org *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
+ + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
+ + dbk:person (dbk:person) = dbk:person *
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname *
+ + dbk:phrase (dbk:phrase) = dbk:phrase *
+ + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
+ + dbk:productname (dbk:productname) = dbk:productname *
+ + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
+ + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
+ + dbk:publisher (dbk:publisher) = dbk:publisher *
+ + dbk:publishername (dbk:publishername) = dbk:publishername *
+ + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
+ + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
+ + dbk:subscript (dbk:subscript) = dbk:subscript *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:superscript (dbk:superscript) = dbk:superscript *
+ + dbk:title (dbk:title) = dbk:title *
+ + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
+ + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
+
+[dbk:bibliography] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bibliodiv (dbk:bibliodiv) = dbk:bibliodiv *
+ + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry *
+ + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:biblioid] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - otherclass (String) 
+
+[dbk:bibliolist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry *
+ + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:bibliomisc] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:bibliomixed] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines
+ + dbk:abstract (dbk:abstract) = dbk:abstract *
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
+ + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
+ + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
+ + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
+ + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
+ + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
+ + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
+ + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
+ + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
+ + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
+ + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
+ + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
+ + dbk:collab (dbk:collab) = dbk:collab *
+ + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
+ + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
+ + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
+ + dbk:copyright (dbk:copyright) = dbk:copyright *
+ + dbk:cover (dbk:cover) = dbk:cover *
+ + dbk:edition (dbk:edition) = dbk:edition *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
+ + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
+ + dbk:itermset (dbk:itermset) = dbk:itermset *
+ + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
+ + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:org (dbk:org) = dbk:org *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
+ + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
+ + dbk:person (dbk:person) = dbk:person *
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname *
+ + dbk:phrase (dbk:phrase) = dbk:phrase *
+ + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
+ + dbk:productname (dbk:productname) = dbk:productname *
+ + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
+ + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
+ + dbk:publisher (dbk:publisher) = dbk:publisher *
+ + dbk:publishername (dbk:publishername) = dbk:publishername *
+ + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
+ + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
+ + dbk:subscript (dbk:subscript) = dbk:subscript *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:superscript (dbk:superscript) = dbk:superscript *
+ + dbk:title (dbk:title) = dbk:title *
+ + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
+ + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:bibliomset] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:publishingInlines, argeodbk:ubiquitousInlines
+ + dbk:abstract (dbk:abstract) = dbk:abstract *
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
+ + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
+ + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
+ + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
+ + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
+ + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
+ + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
+ + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
+ + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
+ + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
+ + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
+ + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
+ + dbk:collab (dbk:collab) = dbk:collab *
+ + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
+ + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
+ + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
+ + dbk:copyright (dbk:copyright) = dbk:copyright *
+ + dbk:cover (dbk:cover) = dbk:cover *
+ + dbk:edition (dbk:edition) = dbk:edition *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
+ + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
+ + dbk:itermset (dbk:itermset) = dbk:itermset *
+ + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
+ + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:org (dbk:org) = dbk:org *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
+ + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
+ + dbk:person (dbk:person) = dbk:person *
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname *
+ + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
+ + dbk:productname (dbk:productname) = dbk:productname *
+ + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
+ + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
+ + dbk:publisher (dbk:publisher) = dbk:publisher *
+ + dbk:publishername (dbk:publishername) = dbk:publishername *
+ + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
+ + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:title (dbk:title) = dbk:title *
+ + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
+ + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
+ - relation (String) 
+
+[dbk:biblioref] > argeodbk:base, argeodbk:linkingAttributes
+ - begin (String) 
+ - end (String) 
+ - endterm (Reference) 
+ - units (String) 
+ - xrefstyle (String) 
+
+[dbk:bibliorelation] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - otherclass (String) 
+ - othertype (String) 
+ - type (String) 
+
+[dbk:biblioset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines
+ + dbk:abstract (dbk:abstract) = dbk:abstract *
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
+ + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
+ + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
+ + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
+ + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
+ + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
+ + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
+ + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
+ + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
+ + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
+ + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
+ + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
+ + dbk:collab (dbk:collab) = dbk:collab *
+ + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
+ + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
+ + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
+ + dbk:copyright (dbk:copyright) = dbk:copyright *
+ + dbk:cover (dbk:cover) = dbk:cover *
+ + dbk:edition (dbk:edition) = dbk:edition *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
+ + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
+ + dbk:itermset (dbk:itermset) = dbk:itermset *
+ + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
+ + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:org (dbk:org) = dbk:org *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
+ + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
+ + dbk:person (dbk:person) = dbk:person *
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname *
+ + dbk:phrase (dbk:phrase) = dbk:phrase *
+ + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
+ + dbk:productname (dbk:productname) = dbk:productname *
+ + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
+ + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
+ + dbk:publisher (dbk:publisher) = dbk:publisher *
+ + dbk:publishername (dbk:publishername) = dbk:publishername *
+ + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
+ + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
+ + dbk:subscript (dbk:subscript) = dbk:subscript *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:superscript (dbk:superscript) = dbk:superscript *
+ + dbk:title (dbk:title) = dbk:title *
+ + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
+ + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
+ - relation (String) 
+
+[dbk:bibliosource] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - otherclass (String) 
+
+[dbk:blockquote] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:attribution (dbk:attribution) = dbk:attribution
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:book] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements *
+ + dbk:appendix (dbk:appendix) = dbk:appendix *
+ + dbk:article (dbk:article) = dbk:article *
+ + dbk:bibliography (dbk:bibliography) = dbk:bibliography *
+ + dbk:chapter (dbk:chapter) = dbk:chapter *
+ + dbk:colophon (dbk:colophon) = dbk:colophon *
+ + dbk:dedication (dbk:dedication) = dbk:dedication *
+ + dbk:glossary (dbk:glossary) = dbk:glossary *
+ + dbk:index (dbk:index) = dbk:index *
+ + dbk:part (dbk:part) = dbk:part *
+ + dbk:preface (dbk:preface) = dbk:preface *
+ + dbk:reference (dbk:reference) = dbk:reference *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:toc (dbk:toc) = dbk:toc *
+ - label (String) 
+ - status (String) 
+
+[dbk:bridgehead] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - otherrenderas (String) 
+ - renderas (String) 
+
+[dbk:callout] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - arearefs (String) 
+
+[dbk:calloutlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:callout (dbk:callout) = dbk:callout *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:caption] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+
+[dbk:caution] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:chapter] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect1 (dbk:sect1) = dbk:sect1 *
+ + dbk:section (dbk:section) = dbk:section *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:citation] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:citebiblioid] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - otherclass (String) 
+
+[dbk:citerefentry] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:manvolnum (dbk:manvolnum) = dbk:manvolnum
+ + dbk:refentrytitle (dbk:refentrytitle) = dbk:refentrytitle
+
+[dbk:citetitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - pubwork (String) 
+
+[dbk:city] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:classname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:classsynopsis] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:classsynopsisinfo (dbk:classsynopsisinfo) = dbk:classsynopsisinfo *
+ + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis *
+ + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis *
+ + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis *
+ + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis *
+ + dbk:ooclass (dbk:ooclass) = dbk:ooclass *
+ + dbk:ooexception (dbk:ooexception) = dbk:ooexception *
+ + dbk:oointerface (dbk:oointerface) = dbk:oointerface *
+ - class (String) 
+ - language (String) 
+
+[dbk:classsynopsisinfo] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ - continuation (String) 
+ - language (String) 
+ - linenumbering (String) 
+ - startinglinenumber (String) 
+ - xml:space (String) 
+
+[dbk:cmdsynopsis] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:arg (dbk:arg) = dbk:arg *
+ + dbk:command (dbk:command) = dbk:command *
+ + dbk:group (dbk:group) = dbk:group *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:sbr (dbk:sbr) = dbk:sbr *
+ + dbk:synopfragment (dbk:synopfragment) = dbk:synopfragment *
+ - cmdlength (String) 
+ - label (String) 
+ - sepchar (String) 
+
+[dbk:co] > argeodbk:base
+ - label (String) 
+ - linkends (String) 
+
+[dbk:code] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:classname (dbk:classname) = dbk:classname *
+ + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
+ + dbk:function (dbk:function) = dbk:function *
+ + dbk:initializer (dbk:initializer) = dbk:initializer *
+ + dbk:interfacename (dbk:interfacename) = dbk:interfacename *
+ + dbk:methodname (dbk:methodname) = dbk:methodname *
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:ooclass (dbk:ooclass) = dbk:ooclass *
+ + dbk:ooexception (dbk:ooexception) = dbk:ooexception *
+ + dbk:oointerface (dbk:oointerface) = dbk:oointerface *
+ + dbk:parameter (dbk:parameter) = dbk:parameter *
+ + dbk:returnvalue (dbk:returnvalue) = dbk:returnvalue *
+ + dbk:type (dbk:type) = dbk:type *
+ + dbk:varname (dbk:varname) = dbk:varname *
+ - language (String) 
+
+[dbk:col] > nt:base
+ - align (String) 
+ - annotations (String) 
+ - arch (String) 
+ - audience (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - condition (String) 
+ - conformance (String) 
+ - dir (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - os (String) 
+ - remap (String) 
+ - revision (String) 
+ - revisionflag (String) 
+ - security (String) 
+ - span (String) 
+ - style (String) 
+ - title (String) 
+ - userlevel (String) 
+ - valign (String) 
+ - vendor (String) 
+ - version (String) 
+ - width (String) 
+ - wordsize (String) 
+ - xreflabel (String) 
+ - xml:base (String) 
+ - xml:id (String) 
+ - xml:lang (String) 
+
+[dbk:colgroup] > nt:base
+ + dbk:col (dbk:col) = dbk:col *
+ - align (String) 
+ - annotations (String) 
+ - arch (String) 
+ - audience (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - condition (String) 
+ - conformance (String) 
+ - dir (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - os (String) 
+ - remap (String) 
+ - revision (String) 
+ - revisionflag (String) 
+ - security (String) 
+ - span (String) 
+ - style (String) 
+ - title (String) 
+ - userlevel (String) 
+ - valign (String) 
+ - vendor (String) 
+ - version (String) 
+ - width (String) 
+ - wordsize (String) 
+ - xreflabel (String) 
+ - xml:base (String) 
+ - xml:id (String) 
+ - xml:lang (String) 
+
+[dbk:collab] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
+ + dbk:org (dbk:org) = dbk:org *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:person (dbk:person) = dbk:person *
+ + dbk:personname (dbk:personname) = dbk:personname *
+
+[dbk:colophon] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:colspec] > argeodbk:base, argeodbk:linkingAttributes
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colname (String) 
+ - colnum (String) 
+ - colsep (String) 
+ - colwidth (String) 
+ - rowsep (String) 
+
+[dbk:command] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:computeroutput] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:command (dbk:command) = dbk:command *
+ + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput *
+ + dbk:envar (dbk:envar) = dbk:envar *
+ + dbk:filename (dbk:filename) = dbk:filename *
+ + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
+ + dbk:option (dbk:option) = dbk:option *
+ + dbk:optional (dbk:optional) = dbk:optional *
+ + dbk:package (dbk:package) = dbk:package *
+ + dbk:parameter (dbk:parameter) = dbk:parameter *
+ + dbk:prompt (dbk:prompt) = dbk:prompt *
+ + dbk:property (dbk:property) = dbk:property *
+ + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
+ + dbk:systemitem (dbk:systemitem) = dbk:systemitem *
+ + dbk:termdef (dbk:termdef) = dbk:termdef *
+ + dbk:userinput (dbk:userinput) = dbk:userinput *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:confdates] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:confgroup] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:confdates (dbk:confdates) = dbk:confdates *
+ + dbk:confnum (dbk:confnum) = dbk:confnum *
+ + dbk:confsponsor (dbk:confsponsor) = dbk:confsponsor *
+ + dbk:conftitle (dbk:conftitle) = dbk:conftitle *
+
+[dbk:confnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:confsponsor] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:conftitle] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:constant] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:constraint] > argeodbk:base, argeodbk:linkingAttributes
+
+[dbk:constraintdef] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:constructorsynopsis] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
+ + dbk:methodname (dbk:methodname) = dbk:methodname
+ + dbk:methodparam (dbk:methodparam) = dbk:methodparam *
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:void (dbk:void) = dbk:void
+ - language (String) 
+
+[dbk:contractnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:contractsponsor] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:contrib] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:copyright] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:holder (dbk:holder) = dbk:holder *
+ + dbk:year (dbk:year) = dbk:year *
+
+[dbk:coref] > argeodbk:base, argeodbk:linkingAttributes
+ - label (String) 
+
+[dbk:country] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:cover] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:classsynopsis (dbk:classsynopsis) = dbk:classsynopsis *
+ + dbk:cmdsynopsis (dbk:cmdsynopsis) = dbk:cmdsynopsis *
+ + dbk:constraintdef (dbk:constraintdef) = dbk:constraintdef *
+ + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis *
+ + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis *
+ + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis *
+ + dbk:funcsynopsis (dbk:funcsynopsis) = dbk:funcsynopsis *
+ + dbk:informalequation (dbk:informalequation) = dbk:informalequation *
+ + dbk:informalexample (dbk:informalexample) = dbk:informalexample *
+ + dbk:informalfigure (dbk:informalfigure) = dbk:informalfigure *
+ + dbk:informaltable (dbk:informaltable) = dbk:informaltable *
+ + dbk:literallayout (dbk:literallayout) = dbk:literallayout *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis *
+ + dbk:msgset (dbk:msgset) = dbk:msgset *
+ + dbk:productionset (dbk:productionset) = dbk:productionset *
+ + dbk:programlisting (dbk:programlisting) = dbk:programlisting *
+ + dbk:programlistingco (dbk:programlistingco) = dbk:programlistingco *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screen (dbk:screen) = dbk:screen *
+ + dbk:screenco (dbk:screenco) = dbk:screenco *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:synopsis (dbk:synopsis) = dbk:synopsis *
+ + dbk:task (dbk:task) = dbk:task *
+
+[dbk:database] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:date] > argeodbk:base, argeodbk:linkingAttributes
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:dedication] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:destructorsynopsis] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
+ + dbk:methodname (dbk:methodname) = dbk:methodname
+ + dbk:methodparam (dbk:methodparam) = dbk:methodparam *
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:void (dbk:void) = dbk:void
+ - language (String) 
+
+[dbk:edition] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:editor] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
+ + dbk:contrib (dbk:contrib) = dbk:contrib *
+ + dbk:email (dbk:email) = dbk:email *
+ + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
+ + dbk:orgname (dbk:orgname) = dbk:orgname
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname
+ + dbk:uri (dbk:uri) = dbk:uri *
+
+[dbk:email] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:emphasis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:entry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colname (String) 
+ - colsep (String) 
+ - morerows (String) 
+ - nameend (String) 
+ - namest (String) 
+ - rotate (String) 
+ - rowsep (String) 
+ - spanname (String) 
+ - valign (String) 
+
+[dbk:entrytbl] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
+ + dbk:tbody (dbk:tbody) = dbk:tbody
+ + dbk:thead (dbk:thead) = dbk:thead
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colname (String) 
+ - cols (String) 
+ - colsep (String) 
+ - nameend (String) 
+ - namest (String) 
+ - rowsep (String) 
+ - spanname (String) 
+ - tgroupstyle (String) 
+
+[dbk:envar] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:epigraph] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:attribution (dbk:attribution) = dbk:attribution
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:literallayout (dbk:literallayout) = dbk:literallayout *
+
+[dbk:equation] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:alt (dbk:alt) = dbk:alt
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ - floatstyle (String) 
+ - label (String) 
+ - pgwide (String) 
+
+[dbk:errorcode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:errorname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:errortext] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:errortype] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:example] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - floatstyle (String) 
+ - label (String) 
+ - pgwide (String) 
+ - width (String) 
+
+[dbk:exceptionname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:extendedlink] > argeodbk:base
+ + dbk:arc (dbk:arc) = dbk:arc *
+ + dbk:locator (dbk:locator) = dbk:locator *
+
+[dbk:fax] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:fieldsynopsis] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:initializer (dbk:initializer) = dbk:initializer
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:type (dbk:type) = dbk:type
+ + dbk:varname (dbk:varname) = dbk:varname
+ - language (String) 
+
+[dbk:figure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - floatstyle (String) 
+ - label (String) 
+ - pgwide (String) 
+
+[dbk:filename] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - path (String) 
+
+[dbk:firstname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:firstterm] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - baseform (String) 
+
+[dbk:footnote] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - label (String) 
+
+[dbk:footnoteref] > argeodbk:base, argeodbk:linkingAttributes
+ - label (String) 
+
+[dbk:foreignphrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:publishingInlines
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:application (dbk:application) = dbk:application *
+ + dbk:biblioref (dbk:biblioref) = dbk:biblioref *
+ + dbk:database (dbk:database) = dbk:database *
+ + dbk:hardware (dbk:hardware) = dbk:hardware *
+ + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
+ + dbk:link (dbk:link) = dbk:link *
+ + dbk:olink (dbk:olink) = dbk:olink *
+ + dbk:phrase (dbk:phrase) = dbk:phrase *
+ + dbk:productname (dbk:productname) = dbk:productname *
+ + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
+ + dbk:subscript (dbk:subscript) = dbk:subscript *
+ + dbk:superscript (dbk:superscript) = dbk:superscript *
+ + dbk:trademark (dbk:trademark) = dbk:trademark *
+ + dbk:xref (dbk:xref) = dbk:xref *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:formalpara] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:para (dbk:para) = dbk:para
+
+[dbk:funcdef] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:function (dbk:function) = dbk:function *
+ + dbk:type (dbk:type) = dbk:type *
+
+[dbk:funcparams] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:funcprototype] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:funcdef (dbk:funcdef) = dbk:funcdef
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:paramdef (dbk:paramdef) = dbk:paramdef *
+ + dbk:varargs (dbk:varargs) = dbk:varargs
+ + dbk:varargs (dbk:varargs) = dbk:varargs
+ + dbk:void (dbk:void) = dbk:void
+
+[dbk:funcsynopsis] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:funcprototype (dbk:funcprototype) = dbk:funcprototype *
+ + dbk:funcsynopsisinfo (dbk:funcsynopsisinfo) = dbk:funcsynopsisinfo *
+ + dbk:info (dbk:info) = dbk:info
+ - language (String) 
+
+[dbk:funcsynopsisinfo] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ - continuation (String) 
+ - language (String) 
+ - linenumbering (String) 
+ - startinglinenumber (String) 
+ - xml:space (String) 
+
+[dbk:function] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:glossary] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bibliography (dbk:bibliography) = dbk:bibliography
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:glossdiv (dbk:glossdiv) = dbk:glossdiv *
+ + dbk:glossentry (dbk:glossentry) = dbk:glossentry *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:glossdef] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:glossseealso (dbk:glossseealso) = dbk:glossseealso *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - subject (String) 
+
+[dbk:glossdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:glossentry (dbk:glossentry) = dbk:glossentry *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:glossentry] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
+ + dbk:abbrev (dbk:abbrev) = dbk:abbrev
+ + dbk:acronym (dbk:acronym) = dbk:acronym
+ + dbk:glossdef (dbk:glossdef) = dbk:glossdef *
+ + dbk:glosssee (dbk:glosssee) = dbk:glosssee
+ + dbk:glossterm (dbk:glossterm) = dbk:glossterm
+ - sortas (String) 
+
+[dbk:glosslist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:glossentry (dbk:glossentry) = dbk:glossentry *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:glosssee] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - otherterm (Reference) 
+
+[dbk:glossseealso] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - otherterm (Reference) 
+
+[dbk:glossterm] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - baseform (String) 
+
+[dbk:group] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:arg (dbk:arg) = dbk:arg *
+ + dbk:group (dbk:group) = dbk:group *
+ + dbk:option (dbk:option) = dbk:option *
+ + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
+ + dbk:sbr (dbk:sbr) = dbk:sbr *
+ + dbk:synopfragmentref (dbk:synopfragmentref) = dbk:synopfragmentref *
+ - choice (String) 
+ - rep (String) 
+
+[dbk:guibutton] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:accel (dbk:accel) = dbk:accel *
+
+[dbk:guiicon] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:accel (dbk:accel) = dbk:accel *
+
+[dbk:guilabel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:accel (dbk:accel) = dbk:accel *
+
+[dbk:guimenu] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:accel (dbk:accel) = dbk:accel *
+
+[dbk:guimenuitem] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:accel (dbk:accel) = dbk:accel *
+
+[dbk:guisubmenu] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:accel (dbk:accel) = dbk:accel *
+
+[dbk:hardware] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:holder] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:honorific] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:imagedata] > argeodbk:base
+ + dbk:info (dbk:info) = dbk:info
+ - align (String) 
+ - contentdepth (String) 
+ - contentwidth (String) 
+ - depth (String) 
+ - entityref (String) 
+ - fileref (String) 
+ - format (String) 
+ - scale (String) 
+ - scalefit (String) 
+ - valign (String) 
+ - width (String) 
+
+[dbk:imageobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:imagedata (dbk:imagedata) = dbk:imagedata
+ + dbk:info (dbk:info) = dbk:info
+
+[dbk:imageobjectco] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:areaspec (dbk:areaspec) = dbk:areaspec
+ + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
+ + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
+ + dbk:info (dbk:info) = dbk:info
+
+[dbk:important] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:index] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:indexdiv (dbk:indexdiv) = dbk:indexdiv *
+ + dbk:indexentry (dbk:indexentry) = dbk:indexentry *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+ - type (String) 
+
+[dbk:indexdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:indexentry (dbk:indexentry) = dbk:indexentry *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:indexentry] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:primaryie (dbk:primaryie) = dbk:primaryie
+ + dbk:secondaryie (dbk:secondaryie) = dbk:secondaryie *
+ + dbk:seealsoie (dbk:seealsoie) = dbk:seealsoie *
+ + dbk:seeie (dbk:seeie) = dbk:seeie *
+ + dbk:tertiaryie (dbk:tertiaryie) = dbk:tertiaryie *
+
+[dbk:indexterm] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:primary (dbk:primary) = dbk:primary
+ + dbk:secondary (dbk:secondary) = dbk:secondary
+ + dbk:see (dbk:see) = dbk:see
+ + dbk:seealso (dbk:seealso) = dbk:seealso *
+ + dbk:tertiary (dbk:tertiary) = dbk:tertiary
+ - class (String) 
+ - pagenum (String) 
+ - scope (String) 
+ - significance (String) 
+ - startref (Reference) 
+ - type (String) 
+ - zone (String) 
+
+[dbk:info] > argeodbk:base
+ + dbk:abstract (dbk:abstract) = dbk:abstract *
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
+ + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
+ + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
+ + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
+ + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
+ + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
+ + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
+ + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
+ + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
+ + dbk:collab (dbk:collab) = dbk:collab *
+ + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
+ + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
+ + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
+ + dbk:copyright (dbk:copyright) = dbk:copyright *
+ + dbk:cover (dbk:cover) = dbk:cover *
+ + dbk:date (dbk:date) = dbk:date *
+ + dbk:edition (dbk:edition) = dbk:edition *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
+ + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
+ + dbk:itermset (dbk:itermset) = dbk:itermset *
+ + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
+ + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:org (dbk:org) = dbk:org *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
+ + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
+ + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
+ + dbk:productname (dbk:productname) = dbk:productname *
+ + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
+ + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
+ + dbk:publisher (dbk:publisher) = dbk:publisher *
+ + dbk:publishername (dbk:publishername) = dbk:publishername *
+ + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
+ + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:title (dbk:title) = dbk:title *
+ + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
+ + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
+ + * (nt:base) = nt:unstructured *
+
+[dbk:informalequation] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:alt (dbk:alt) = dbk:alt
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+
+[dbk:informalexample] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - floatstyle (String) 
+ - width (String) 
+
+[dbk:informalfigure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - floatstyle (String) 
+ - label (String) 
+ - pgwide (String) 
+
+[dbk:informaltable] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:col (dbk:col) = dbk:col *
+ + dbk:colgroup (dbk:colgroup) = dbk:colgroup *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:tbody (dbk:tbody) = dbk:tbody *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ + dbk:tfoot (dbk:tfoot) = dbk:tfoot
+ + dbk:tgroup (dbk:tgroup) = dbk:tgroup *
+ + dbk:thead (dbk:thead) = dbk:thead
+ + dbk:tr (dbk:tr) = dbk:tr *
+ - border (String) 
+ - cellpadding (String) 
+ - cellspacing (String) 
+ - class (String) 
+ - colsep (String) 
+ - floatstyle (String) 
+ - frame (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - orient (String) 
+ - pgwide (String) 
+ - rowheader (String) 
+ - rowsep (String) 
+ - rules (String) 
+ - style (String) 
+ - summary (String) 
+ - tabstyle (String) 
+ - title (String) 
+ - width (String) 
+
+[dbk:initializer] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:inlineequation] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:alt (dbk:alt) = dbk:alt
+ + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
+ + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase *
+
+[dbk:inlinemediaobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:alt (dbk:alt) = dbk:alt
+ + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
+ + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
+ + dbk:imageobjectco (dbk:imageobjectco) = dbk:imageobjectco *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
+
+[dbk:interfacename] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:issuenum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:itemizedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:listitem (dbk:listitem) = dbk:listitem *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - mark (String) 
+ - spacing (String) 
+
+[dbk:itermset] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
+
+[dbk:jobtitle] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:keycap] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - function (String) 
+ - otherfunction (String) 
+
+[dbk:keycode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:keycombo] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:keycap (dbk:keycap) = dbk:keycap *
+ + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
+ + dbk:keysym (dbk:keysym) = dbk:keysym *
+ + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
+ - action (String) 
+ - otheraction (String) 
+
+[dbk:keysym] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:keyword] > argeodbk:base, argeodbk:linkingAttributes
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:keywordset] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:keyword (dbk:keyword) = dbk:keyword *
+
+[dbk:label] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:legalnotice] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:lhs] > argeodbk:base, argeodbk:linkingAttributes
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:lineage] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:lineannotation] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:link] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - endterm (Reference) 
+ - xrefstyle (String) 
+
+[dbk:listitem] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - override (String) 
+
+[dbk:literal] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:literallayout] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ - class (String) 
+ - continuation (String) 
+ - language (String) 
+ - linenumbering (String) 
+ - startinglinenumber (String) 
+ - xml:space (String) 
+
+[dbk:locator] > argeodbk:base
+ - xlink:label (String) 
+
+[dbk:manvolnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:markup] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:mathphrase] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:emphasis (dbk:emphasis) = dbk:emphasis *
+
+[dbk:mediaobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:alt (dbk:alt) = dbk:alt
+ + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
+ + dbk:imageobjectco (dbk:imageobjectco) = dbk:imageobjectco *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
+
+[dbk:member] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:menuchoice] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:guibutton (dbk:guibutton) = dbk:guibutton *
+ + dbk:guiicon (dbk:guiicon) = dbk:guiicon *
+ + dbk:guilabel (dbk:guilabel) = dbk:guilabel *
+ + dbk:guimenu (dbk:guimenu) = dbk:guimenu *
+ + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem *
+ + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu *
+ + dbk:shortcut (dbk:shortcut) = dbk:shortcut
+
+[dbk:methodname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:methodparam] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:funcparams (dbk:funcparams) = dbk:funcparams
+ + dbk:initializer (dbk:initializer) = dbk:initializer
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:parameter (dbk:parameter) = dbk:parameter
+ + dbk:type (dbk:type) = dbk:type *
+ - choice (String) 
+ - rep (String) 
+
+[dbk:methodsynopsis] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
+ + dbk:methodname (dbk:methodname) = dbk:methodname
+ + dbk:methodparam (dbk:methodparam) = dbk:methodparam *
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:type (dbk:type) = dbk:type
+ + dbk:void (dbk:void) = dbk:void
+ - language (String) 
+
+[dbk:modifier] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - xml:space (String) 
+
+[dbk:mousebutton] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:msg] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:msgmain (dbk:msgmain) = dbk:msgmain
+ + dbk:msgrel (dbk:msgrel) = dbk:msgrel *
+ + dbk:msgsub (dbk:msgsub) = dbk:msgsub *
+
+[dbk:msgaud] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:msgentry] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:msg (dbk:msg) = dbk:msg *
+ + dbk:msgexplan (dbk:msgexplan) = dbk:msgexplan *
+ + dbk:msginfo (dbk:msginfo) = dbk:msginfo
+
+[dbk:msgexplan] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:msginfo] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:msgaud (dbk:msgaud) = dbk:msgaud *
+ + dbk:msglevel (dbk:msglevel) = dbk:msglevel *
+ + dbk:msgorig (dbk:msgorig) = dbk:msgorig *
+
+[dbk:msglevel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:msgmain] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:msgtext (dbk:msgtext) = dbk:msgtext
+
+[dbk:msgorig] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:msgrel] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:msgtext (dbk:msgtext) = dbk:msgtext
+
+[dbk:msgset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:msgentry (dbk:msgentry) = dbk:msgentry *
+ + dbk:simplemsgentry (dbk:simplemsgentry) = dbk:simplemsgentry *
+
+[dbk:msgsub] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:msgtext (dbk:msgtext) = dbk:msgtext
+
+[dbk:msgtext] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:nonterminal] > argeodbk:base, argeodbk:linkingAttributes
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+ - def (String) 
+
+[dbk:note] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:olink] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - localinfo (String) 
+ - targetdoc (String) 
+ - targetptr (String) 
+ - type (String) 
+ - xrefstyle (String) 
+
+[dbk:ooclass] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:classname (dbk:classname) = dbk:classname
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:package (dbk:package) = dbk:package *
+
+[dbk:ooexception] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:package (dbk:package) = dbk:package *
+
+[dbk:oointerface] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:interfacename (dbk:interfacename) = dbk:interfacename
+ + dbk:modifier (dbk:modifier) = dbk:modifier *
+ + dbk:package (dbk:package) = dbk:package *
+
+[dbk:option] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:optional] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:orderedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:listitem (dbk:listitem) = dbk:listitem *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - continuation (String) 
+ - inheritnum (String) 
+ - numeration (String) 
+ - spacing (String) 
+ - startingnumber (String) 
+
+[dbk:org] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
+ + dbk:email (dbk:email) = dbk:email *
+ + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
+ + dbk:orgname (dbk:orgname) = dbk:orgname
+ + dbk:uri (dbk:uri) = dbk:uri *
+
+[dbk:orgdiv] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:orgname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - otherclass (String) 
+
+[dbk:otheraddr] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:othercredit] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
+ + dbk:contrib (dbk:contrib) = dbk:contrib *
+ + dbk:email (dbk:email) = dbk:email *
+ + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
+ + dbk:orgname (dbk:orgname) = dbk:orgname
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname
+ + dbk:uri (dbk:uri) = dbk:uri *
+ - class (String) 
+ - otherclass (String) 
+
+[dbk:othername] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:package] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:pagenums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:para] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:paramdef] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:funcparams (dbk:funcparams) = dbk:funcparams *
+ + dbk:initializer (dbk:initializer) = dbk:initializer *
+ + dbk:parameter (dbk:parameter) = dbk:parameter *
+ + dbk:type (dbk:type) = dbk:type *
+ - choice (String) 
+
+[dbk:parameter] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:part] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements *
+ + dbk:appendix (dbk:appendix) = dbk:appendix *
+ + dbk:article (dbk:article) = dbk:article *
+ + dbk:bibliography (dbk:bibliography) = dbk:bibliography *
+ + dbk:chapter (dbk:chapter) = dbk:chapter *
+ + dbk:colophon (dbk:colophon) = dbk:colophon *
+ + dbk:dedication (dbk:dedication) = dbk:dedication *
+ + dbk:glossary (dbk:glossary) = dbk:glossary *
+ + dbk:index (dbk:index) = dbk:index *
+ + dbk:partintro (dbk:partintro) = dbk:partintro
+ + dbk:preface (dbk:preface) = dbk:preface *
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:reference (dbk:reference) = dbk:reference *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:toc (dbk:toc) = dbk:toc *
+ - label (String) 
+ - status (String) 
+
+[dbk:partintro] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect1 (dbk:sect1) = dbk:sect1 *
+ + dbk:section (dbk:section) = dbk:section *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:person] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
+ + dbk:email (dbk:email) = dbk:email *
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname
+ + dbk:uri (dbk:uri) = dbk:uri *
+
+[dbk:personblurb] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+
+[dbk:personname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:firstname (dbk:firstname) = dbk:firstname *
+ + dbk:honorific (dbk:honorific) = dbk:honorific *
+ + dbk:lineage (dbk:lineage) = dbk:lineage *
+ + dbk:othername (dbk:othername) = dbk:othername *
+ + dbk:surname (dbk:surname) = dbk:surname *
+
+[dbk:phone] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:phrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:pob] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:postcode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:preface] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect1 (dbk:sect1) = dbk:sect1 *
+ + dbk:section (dbk:section) = dbk:section *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:primary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - sortas (String) 
+
+[dbk:primaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - linkends (String) 
+
+[dbk:printhistory] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+
+[dbk:procedure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:step (dbk:step) = dbk:step *
+
+[dbk:production] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:constraint (dbk:constraint) = dbk:constraint *
+ + dbk:lhs (dbk:lhs) = dbk:lhs
+ + dbk:rhs (dbk:rhs) = dbk:rhs
+
+[dbk:productionrecap] > argeodbk:base, argeodbk:linkingAttributes
+
+[dbk:productionset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:production (dbk:production) = dbk:production *
+ + dbk:productionrecap (dbk:productionrecap) = dbk:productionrecap *
+
+[dbk:productname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:productnumber] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:programlisting] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ - continuation (String) 
+ - language (String) 
+ - linenumbering (String) 
+ - startinglinenumber (String) 
+ - width (String) 
+ - xml:space (String) 
+
+[dbk:programlistingco] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:areaspec (dbk:areaspec) = dbk:areaspec
+ + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:programlisting (dbk:programlisting) = dbk:programlisting
+
+[dbk:prompt] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+
+[dbk:property] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:pubdate] > argeodbk:base, argeodbk:linkingAttributes
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:publisher] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:address (dbk:address) = dbk:address *
+ + dbk:publishername (dbk:publishername) = dbk:publishername
+
+[dbk:publishername] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:qandadiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:qandadiv (dbk:qandadiv) = dbk:qandadiv *
+ + dbk:qandaentry (dbk:qandaentry) = dbk:qandaentry *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:qandaentry] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:answer (dbk:answer) = dbk:answer *
+ + dbk:question (dbk:question) = dbk:question
+
+[dbk:qandaset] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:qandadiv (dbk:qandadiv) = dbk:qandadiv *
+ + dbk:qandaentry (dbk:qandaentry) = dbk:qandaentry *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - defaultlabel (String) 
+
+[dbk:question] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:label (dbk:label) = dbk:label
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:quote] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:refclass] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:application (dbk:application) = dbk:application *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:refdescriptor] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:refentry] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:refmeta (dbk:refmeta) = dbk:refmeta
+ + dbk:refnamediv (dbk:refnamediv) = dbk:refnamediv *
+ + dbk:refsect1 (dbk:refsect1) = dbk:refsect1 *
+ + dbk:refsection (dbk:refsection) = dbk:refsection *
+ + dbk:refsynopsisdiv (dbk:refsynopsisdiv) = dbk:refsynopsisdiv
+ - label (String) 
+ - status (String) 
+
+[dbk:refentrytitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:reference] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:partintro (dbk:partintro) = dbk:partintro
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:refmeta] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
+ + dbk:manvolnum (dbk:manvolnum) = dbk:manvolnum
+ + dbk:refentrytitle (dbk:refentrytitle) = dbk:refentrytitle
+ + dbk:refmiscinfo (dbk:refmiscinfo) = dbk:refmiscinfo *
+
+[dbk:refmiscinfo] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - otherclass (String) 
+
+[dbk:refname] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:refnamediv] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:refclass (dbk:refclass) = dbk:refclass *
+ + dbk:refdescriptor (dbk:refdescriptor) = dbk:refdescriptor
+ + dbk:refname (dbk:refname) = dbk:refname *
+ + dbk:refpurpose (dbk:refpurpose) = dbk:refpurpose
+
+[dbk:refpurpose] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:refsect1] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 *
+ + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:refsect2] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refsect3 (dbk:refsect3) = dbk:refsect3 *
+ + dbk:refsect3 (dbk:refsect3) = dbk:refsect3 *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:refsect3] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:refsection] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refsection (dbk:refsection) = dbk:refsection *
+ + dbk:refsection (dbk:refsection) = dbk:refsection *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:refsynopsisdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 *
+ + dbk:refsection (dbk:refsection) = dbk:refsection *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+
+[dbk:releaseinfo] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:remark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:replaceable] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ - class (String) 
+
+[dbk:returnvalue] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:revdescription] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:revhistory] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:revision (dbk:revision) = dbk:revision *
+
+[dbk:revision] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
+ + dbk:date (dbk:date) = dbk:date
+ + dbk:revdescription (dbk:revdescription) = dbk:revdescription
+ + dbk:revnumber (dbk:revnumber) = dbk:revnumber
+ + dbk:revremark (dbk:revremark) = dbk:revremark
+
+[dbk:revnumber] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:revremark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:rhs] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
+ + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
+ + dbk:sbr (dbk:sbr) = dbk:sbr *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:row] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:entry (dbk:entry) = dbk:entry *
+ + dbk:entrytbl (dbk:entrytbl) = dbk:entrytbl *
+ - rowsep (String) 
+ - valign (String) 
+
+[dbk:sbr] > argeodbk:base
+
+[dbk:screen] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ - continuation (String) 
+ - language (String) 
+ - linenumbering (String) 
+ - startinglinenumber (String) 
+ - width (String) 
+ - xml:space (String) 
+
+[dbk:screenco] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:areaspec (dbk:areaspec) = dbk:areaspec
+ + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:screen (dbk:screen) = dbk:screen
+
+[dbk:screenshot] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+
+[dbk:secondary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - sortas (String) 
+
+[dbk:secondaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - linkends (String) 
+
+[dbk:sect1] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect2 (dbk:sect2) = dbk:sect2 *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:sect2] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect3 (dbk:sect3) = dbk:sect3 *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:sect3] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect4 (dbk:sect4) = dbk:sect4 *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:sect4] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:sect5 (dbk:sect5) = dbk:sect5 *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:sect5] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:section] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:refentry (dbk:refentry) = dbk:refentry *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:section (dbk:section) = dbk:section *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+ + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
+
+[dbk:see] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:seealso] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:seealsoie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - linkends (String) 
+
+[dbk:seeie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:seg] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:seglistitem] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:seg (dbk:seg) = dbk:seg *
+
+[dbk:segmentedlist] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:seglistitem (dbk:seglistitem) = dbk:seglistitem *
+ + dbk:segtitle (dbk:segtitle) = dbk:segtitle *
+
+[dbk:segtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:seriesvolnums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:set] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:book (dbk:book) = dbk:book *
+ + dbk:set (dbk:set) = dbk:set *
+ + dbk:setindex (dbk:setindex) = dbk:setindex
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:toc (dbk:toc) = dbk:toc
+ - label (String) 
+ - status (String) 
+
+[dbk:setindex] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:indexdiv (dbk:indexdiv) = dbk:indexdiv *
+ + dbk:indexentry (dbk:indexentry) = dbk:indexentry *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+ - type (String) 
+
+[dbk:shortaffil] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:shortcut] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:keycap (dbk:keycap) = dbk:keycap *
+ + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
+ + dbk:keysym (dbk:keysym) = dbk:keysym *
+ + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
+ - action (String) 
+ - otheraction (String) 
+
+[dbk:sidebar] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:simpara] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:info (dbk:info) = dbk:info *
+
+[dbk:simplelist] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:member (dbk:member) = dbk:member *
+ - columns (String) 
+ - type (String) 
+
+[dbk:simplemsgentry] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:msgexplan (dbk:msgexplan) = dbk:msgexplan *
+ + dbk:msgtext (dbk:msgtext) = dbk:msgtext
+ - msgaud (String) 
+ - msglevel (String) 
+ - msgorig (String) 
+
+[dbk:simplesect] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:spanspec] > argeodbk:base, argeodbk:linkingAttributes
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colsep (String) 
+ - nameend (String) 
+ - namest (String) 
+ - rowsep (String) 
+ - spanname (String) 
+
+[dbk:state] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:step] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:stepalternatives (dbk:stepalternatives) = dbk:stepalternatives
+ + dbk:substeps (dbk:substeps) = dbk:substeps
+ - performance (String) 
+
+[dbk:stepalternatives] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:step (dbk:step) = dbk:step *
+ - performance (String) 
+
+[dbk:street] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:subject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:subjectterm (dbk:subjectterm) = dbk:subjectterm *
+ - weight (String) 
+
+[dbk:subjectset] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:subject (dbk:subject) = dbk:subject *
+ - scheme (String) 
+
+[dbk:subjectterm] > argeodbk:base, argeodbk:linkingAttributes
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:subscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:substeps] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:step (dbk:step) = dbk:step *
+ - performance (String) 
+
+[dbk:subtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:superscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:surname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:symbol] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:synopfragment] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:arg (dbk:arg) = dbk:arg *
+ + dbk:group (dbk:group) = dbk:group *
+
+[dbk:synopfragmentref] > argeodbk:base, argeodbk:linkingAttributes
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:synopsis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ - continuation (String) 
+ - label (String) 
+ - language (String) 
+ - linenumbering (String) 
+ - startinglinenumber (String) 
+ - xml:space (String) 
+
+[dbk:systemitem] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ + dbk:co (dbk:co) = dbk:co *
+ - class (String) 
+
+[dbk:table] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:col (dbk:col) = dbk:col *
+ + dbk:colgroup (dbk:colgroup) = dbk:colgroup *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:tbody (dbk:tbody) = dbk:tbody *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ + dbk:tfoot (dbk:tfoot) = dbk:tfoot
+ + dbk:tgroup (dbk:tgroup) = dbk:tgroup *
+ + dbk:thead (dbk:thead) = dbk:thead
+ + dbk:tr (dbk:tr) = dbk:tr *
+ - border (String) 
+ - cellpadding (String) 
+ - cellspacing (String) 
+ - class (String) 
+ - colsep (String) 
+ - floatstyle (String) 
+ - frame (String) 
+ - label (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - orient (String) 
+ - pgwide (String) 
+ - rowheader (String) 
+ - rowsep (String) 
+ - rules (String) 
+ - shortentry (String) 
+ - style (String) 
+ - summary (String) 
+ - tabstyle (String) 
+ - title (String) 
+ - tocentry (String) 
+ - width (String) 
+
+[dbk:tag] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - namespace (String) 
+
+[dbk:task] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:example (dbk:example) = dbk:example *
+ + dbk:procedure (dbk:procedure) = dbk:procedure
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:taskprerequisites (dbk:taskprerequisites) = dbk:taskprerequisites
+ + dbk:taskrelated (dbk:taskrelated) = dbk:taskrelated
+ + dbk:tasksummary (dbk:tasksummary) = dbk:tasksummary
+
+[dbk:taskprerequisites] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:taskrelated] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:tasksummary] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:tbody] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:row (dbk:row) = dbk:row *
+ + dbk:tr (dbk:tr) = dbk:tr *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+ - valign (String) 
+
+[dbk:td] > argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - abbr (String) 
+ - align (String) 
+ - annotations (String) 
+ - arch (String) 
+ - audience (String) 
+ - axis (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - colspan (String) 
+ - condition (String) 
+ - conformance (String) 
+ - dir (String) 
+ - headers (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - os (String) 
+ - remap (String) 
+ - revision (String) 
+ - revisionflag (String) 
+ - rowspan (String) 
+ - scope (String) 
+ - security (String) 
+ - style (String) 
+ - title (String) 
+ - userlevel (String) 
+ - valign (String) 
+ - vendor (String) 
+ - version (String) 
+ - wordsize (String) 
+ - xreflabel (String) 
+ - xml:base (String) 
+ - xml:id (String) 
+ - xml:lang (String) 
+
+[dbk:term] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:termdef] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - baseform (String) 
+ - sortas (String) 
+
+[dbk:tertiary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - sortas (String) 
+
+[dbk:tertiaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - linkends (String) 
+
+[dbk:textdata] > argeodbk:base
+ + dbk:info (dbk:info) = dbk:info
+ - encoding (String) 
+ - entityref (String) 
+ - fileref (String) 
+ - format (String) 
+
+[dbk:textobject] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:phrase (dbk:phrase) = dbk:phrase
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:textdata (dbk:textdata) = dbk:textdata
+
+[dbk:tfoot] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:row (dbk:row) = dbk:row *
+ + dbk:tr (dbk:tr) = dbk:tr *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+ - valign (String) 
+
+[dbk:tgroup] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
+ + dbk:tbody (dbk:tbody) = dbk:tbody
+ + dbk:tfoot (dbk:tfoot) = dbk:tfoot
+ + dbk:thead (dbk:thead) = dbk:thead
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - cols (String) 
+ - colsep (String) 
+ - rowsep (String) 
+ - tgroupstyle (String) 
+
+[dbk:th] > argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ - abbr (String) 
+ - align (String) 
+ - annotations (String) 
+ - arch (String) 
+ - audience (String) 
+ - axis (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - colspan (String) 
+ - condition (String) 
+ - conformance (String) 
+ - dir (String) 
+ - headers (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - os (String) 
+ - remap (String) 
+ - revision (String) 
+ - revisionflag (String) 
+ - rowspan (String) 
+ - scope (String) 
+ - security (String) 
+ - style (String) 
+ - title (String) 
+ - userlevel (String) 
+ - valign (String) 
+ - vendor (String) 
+ - version (String) 
+ - wordsize (String) 
+ - xreflabel (String) 
+ - xml:base (String) 
+ - xml:id (String) 
+ - xml:lang (String) 
+
+[dbk:thead] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:row (dbk:row) = dbk:row *
+ + dbk:tr (dbk:tr) = dbk:tr *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+ - valign (String) 
+
+[dbk:tip] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:title] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:titleabbrev] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:toc] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:tocdiv (dbk:tocdiv) = dbk:tocdiv *
+ + dbk:tocentry (dbk:tocentry) = dbk:tocentry *
+
+[dbk:tocdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:tocdiv (dbk:tocdiv) = dbk:tocdiv *
+ + dbk:tocentry (dbk:tocentry) = dbk:tocentry *
+ - pagenum (String) 
+
+[dbk:tocentry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - pagenum (String) 
+
+[dbk:token] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:tr] > nt:base
+ + dbk:td (dbk:td) = dbk:td *
+ + dbk:th (dbk:th) = dbk:th *
+ - align (String) 
+ - annotations (String) 
+ - arch (String) 
+ - audience (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - condition (String) 
+ - conformance (String) 
+ - dir (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - os (String) 
+ - remap (String) 
+ - revision (String) 
+ - revisionflag (String) 
+ - security (String) 
+ - style (String) 
+ - title (String) 
+ - userlevel (String) 
+ - valign (String) 
+ - vendor (String) 
+ - version (String) 
+ - wordsize (String) 
+ - xreflabel (String) 
+ - xml:base (String) 
+ - xml:id (String) 
+ - xml:lang (String) 
+
+[dbk:trademark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:type] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:uri] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - type (String) 
+
+[dbk:userinput] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:ubiquitousInlines
+ + dbk:accel (dbk:accel) = dbk:accel *
+ + dbk:co (dbk:co) = dbk:co *
+ + dbk:command (dbk:command) = dbk:command *
+ + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput *
+ + dbk:envar (dbk:envar) = dbk:envar *
+ + dbk:filename (dbk:filename) = dbk:filename *
+ + dbk:guibutton (dbk:guibutton) = dbk:guibutton *
+ + dbk:guiicon (dbk:guiicon) = dbk:guiicon *
+ + dbk:guilabel (dbk:guilabel) = dbk:guilabel *
+ + dbk:guimenu (dbk:guimenu) = dbk:guimenu *
+ + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem *
+ + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu *
+ + dbk:keycap (dbk:keycap) = dbk:keycap *
+ + dbk:keycode (dbk:keycode) = dbk:keycode *
+ + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
+ + dbk:keysym (dbk:keysym) = dbk:keysym *
+ + dbk:menuchoice (dbk:menuchoice) = dbk:menuchoice *
+ + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
+ + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
+ + dbk:option (dbk:option) = dbk:option *
+ + dbk:optional (dbk:optional) = dbk:optional *
+ + dbk:package (dbk:package) = dbk:package *
+ + dbk:parameter (dbk:parameter) = dbk:parameter *
+ + dbk:prompt (dbk:prompt) = dbk:prompt *
+ + dbk:property (dbk:property) = dbk:property *
+ + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
+ + dbk:shortcut (dbk:shortcut) = dbk:shortcut *
+ + dbk:systemitem (dbk:systemitem) = dbk:systemitem *
+ + dbk:termdef (dbk:termdef) = dbk:termdef *
+ + dbk:userinput (dbk:userinput) = dbk:userinput *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:varargs] > argeodbk:base, argeodbk:linkingAttributes
+
+[dbk:variablelist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+ + dbk:varlistentry (dbk:varlistentry) = dbk:varlistentry *
+ - spacing (String) 
+ - termlength (String) 
+
+[dbk:varlistentry] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:listitem (dbk:listitem) = dbk:listitem
+ + dbk:term (dbk:term) = dbk:term *
+
+[dbk:varname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:videodata] > argeodbk:base
+ + dbk:info (dbk:info) = dbk:info
+ - align (String) 
+ - contentdepth (String) 
+ - contentwidth (String) 
+ - depth (String) 
+ - entityref (String) 
+ - fileref (String) 
+ - format (String) 
+ - scale (String) 
+ - scalefit (String) 
+ - valign (String) 
+ - width (String) 
+
+[dbk:videoobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:videodata (dbk:videodata) = dbk:videodata
+
+[dbk:void] > argeodbk:base, argeodbk:linkingAttributes
+
+[dbk:volumenum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:warning] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
+ + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
+
+[dbk:wordasword] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:xref] > argeodbk:base, argeodbk:linkingAttributes
+ - endterm (Reference) 
+ - xrefstyle (String) 
+
+[dbk:year] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+//[xs:anyType] > nt:base
+// + * (nt:base) 
+// + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+// - * (undefined) 
+
+
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/docbook.cnd b/org.argeo.app.jcr/src/org/argeo/app/jcr/docbook/docbook.cnd
new file mode 100644 (file)
index 0000000..5514e64
--- /dev/null
@@ -0,0 +1,527 @@
+<dbk = 'http://docbook.org/ns/docbook'>
+<argeodbk = 'http://www.argeo.org/ns/argeodbk'>
+<xlink = 'http://www.w3.org/1999/xlink'>
+
+[argeodbk:titled]
+mixin
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:title (dbk:title) = dbk:title *
+
+[argeodbk:linkingAttributes]
+mixin
+ - linkend (String)
+ - xlink:actuate (String)
+ - xlink:arcrole (String)
+ - xlink:href (String)
+ - xlink:role (String)
+ - xlink:show (String)
+ - xlink:title (String)
+ - xlink:type (String)
+
+[argeodbk:freeText]
+mixin
+ + dbk:phrase (dbk:phrase) = dbk:phrase *
+ + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[argeodbk:markupInlines]
+mixin
+
+[argeodbk:listElements]
+mixin
+ + dbk:itemizedlist (dbk:itemizedlist) = dbk:itemizedlist *
+ + dbk:orderedlist (dbk:orderedlist) = dbk:orderedlist *
+ + dbk:simplelist (dbk:simplelist) = dbk:simplelist *
+
+[argeodbk:paragraphElements]
+mixin
+ + dbk:para (dbk:para) = dbk:para *
+
+[argeodbk:indexingInlines]
+mixin
+
+[argeodbk:techDocElements]
+mixin
+ + dbk:table (dbk:table) = dbk:table *
+
+[argeodbk:techDocInlines]
+mixin
+
+[argeodbk:publishingElements]
+mixin
+
+[argeodbk:ubiquitousInlines]
+mixin
+ + dbk:alt (dbk:alt) = dbk:alt *
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:biblioref (dbk:biblioref) = dbk:biblioref *
+ + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
+ + dbk:link (dbk:link) = dbk:link *
+ + dbk:olink (dbk:olink) = dbk:olink *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:subscript (dbk:subscript) = dbk:subscript *
+ + dbk:superscript (dbk:superscript) = dbk:superscript *
+ + dbk:xref (dbk:xref) = dbk:xref *
+
+[argeodbk:abstractSection]
+mixin
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String)
+ - status (String)
+
+[argeodbk:bibliographyInlines]
+mixin
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:personname (dbk:personname) = dbk:personname *
+
+[argeodbk:publishingInlines]
+mixin
+ + dbk:emphasis (dbk:emphasis) = dbk:emphasis *
+
+[argeodbk:base]
+abstract
+orderable
+ - annotations (String)
+ - arch (String)
+ - audience (String)
+ - condition (String)
+ - conformance (String)
+ - dir (String)
+ - os (String)
+ - remap (String)
+ - revision (String)
+ - revisionflag (String)
+ - role (String)
+ - security (String)
+ - userlevel (String)
+ - vendor (String)
+ - version (String)
+ - wordsize (String)
+ - xreflabel (String)
+
+[dbk:alt] > argeodbk:base
+ + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+
+[dbk:anchor] > argeodbk:base
+
+[dbk:annotation] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ - annotates (String) 
+
+[dbk:article] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:section (dbk:section) = dbk:section *
+ - class (String) 
+
+[dbk:audiodata] > argeodbk:base
+ + dbk:info (dbk:info) = dbk:info
+ - entityref (String) 
+ - fileref (String) 
+ - format (String) 
+
+[dbk:audioobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:audiodata (dbk:audiodata) = dbk:audiodata
+ + dbk:info (dbk:info) = dbk:info
+
+[dbk:author] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
+ + dbk:orgname (dbk:orgname) = dbk:orgname
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname
+
+[dbk:biblioref] > argeodbk:base, argeodbk:linkingAttributes
+ - begin (String) 
+ - end (String) 
+ - endterm (Reference) 
+ - units (String) 
+ - xrefstyle (String) 
+
+[dbk:book] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:article (dbk:article) = dbk:article *
+ + dbk:chapter (dbk:chapter) = dbk:chapter *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:caption] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+
+[dbk:chapter] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:section (dbk:section) = dbk:section *
+
+[dbk:colspec] > argeodbk:base, argeodbk:linkingAttributes
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colname (String) 
+ - colnum (String) 
+ - colsep (String) 
+ - colwidth (String) 
+ - rowsep (String) 
+
+[dbk:editor] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
+ + dbk:orgname (dbk:orgname) = dbk:orgname
+ + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
+ + dbk:personname (dbk:personname) = dbk:personname
+
+[dbk:emphasis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:entry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colname (String) 
+ - colsep (String) 
+ - morerows (String) 
+ - nameend (String) 
+ - namest (String) 
+ - rotate (String) 
+ - rowsep (String) 
+ - spanname (String) 
+ - valign (String) 
+
+[dbk:entrytbl] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
+ + dbk:tbody (dbk:tbody) = dbk:tbody
+ + dbk:thead (dbk:thead) = dbk:thead
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colname (String) 
+ - cols (String) 
+ - colsep (String) 
+ - nameend (String) 
+ - namest (String) 
+ - rowsep (String) 
+ - spanname (String) 
+ - tgroupstyle (String) 
+
+[dbk:imagedata] > argeodbk:base
+ + dbk:info (dbk:info) = dbk:info
+ - align (String) 
+ - contentdepth (String) 
+ - contentwidth (String) 
+ - depth (String) 
+ - entityref (String) 
+ - fileref (String) 
+ - format (String) 
+ - scale (String) 
+ - scalefit (String) 
+ - valign (String) 
+ - width (String) 
+
+[dbk:imageobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:imagedata (dbk:imagedata) = dbk:imagedata
+ + dbk:info (dbk:info) = dbk:info
+
+[dbk:info] > argeodbk:base
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:author (dbk:author) = dbk:author *
+ + dbk:editor (dbk:editor) = dbk:editor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:orgname (dbk:orgname) = dbk:orgname *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ + dbk:title (dbk:title) = dbk:title *
+ + * (nt:base) = nt:unstructured *
+
+[dbk:inlinemediaobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:alt (dbk:alt) = dbk:alt
+ + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
+ + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
+
+[dbk:itemizedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:listitem (dbk:listitem) = dbk:listitem *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ - mark (String) 
+ - spacing (String) 
+
+[dbk:link] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - endterm (Reference) 
+ - xrefstyle (String) 
+
+[dbk:listitem] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ - override (String) 
+
+[dbk:mediaobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:alt (dbk:alt) = dbk:alt
+ + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
+
+[dbk:olink] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ - localinfo (String) 
+ - targetdoc (String) 
+ - targetptr (String) 
+ - type (String) 
+ - xrefstyle (String) 
+
+[dbk:orderedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:listitem (dbk:listitem) = dbk:listitem *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:remark (dbk:remark) = dbk:remark *
+ - continuation (String) 
+ - inheritnum (String) 
+ - numeration (String) 
+ - spacing (String) 
+ - startingnumber (String) 
+
+[dbk:orgdiv] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:orgname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+ - otherclass (String) 
+
+[dbk:para] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+ + dbk:info (dbk:info) = dbk:info *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+
+[dbk:personblurb] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+
+[dbk:personname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:phrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:remark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:replaceable] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+ - class (String) 
+
+[dbk:row] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:entry (dbk:entry) = dbk:entry *
+ + dbk:entrytbl (dbk:entrytbl) = dbk:entrytbl *
+ - rowsep (String) 
+ - valign (String) 
+
+[dbk:section] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:section (dbk:section) = dbk:section *
+
+[dbk:set] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:book (dbk:book) = dbk:book *
+ + dbk:set (dbk:set) = dbk:set *
+ + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
+ - label (String) 
+ - status (String) 
+
+[dbk:simplelist] > argeodbk:base, argeodbk:linkingAttributes
+ - columns (String) 
+ - type (String) 
+
+[dbk:spanspec] > argeodbk:base, argeodbk:linkingAttributes
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - colsep (String) 
+ - nameend (String) 
+ - namest (String) 
+ - rowsep (String) 
+ - spanname (String) 
+
+[dbk:subscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:subtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:superscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
+
+[dbk:table] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled
+ + dbk:caption (dbk:caption) = dbk:caption
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:tbody (dbk:tbody) = dbk:tbody *
+ + dbk:textobject (dbk:textobject) = dbk:textobject *
+ + dbk:tfoot (dbk:tfoot) = dbk:tfoot
+ + dbk:tgroup (dbk:tgroup) = dbk:tgroup *
+ + dbk:thead (dbk:thead) = dbk:thead
+ - border (String) 
+ - cellpadding (String) 
+ - cellspacing (String) 
+ - class (String) 
+ - colsep (String) 
+ - floatstyle (String) 
+ - frame (String) 
+ - label (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - orient (String) 
+ - pgwide (String) 
+ - rowheader (String) 
+ - rowsep (String) 
+ - rules (String) 
+ - shortentry (String) 
+ - style (String) 
+ - summary (String) 
+ - tabstyle (String) 
+ - title (String) 
+ - tocentry (String) 
+ - width (String) 
+
+[dbk:tbody] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:row (dbk:row) = dbk:row *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+ - valign (String) 
+
+[dbk:textobject] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
+ + dbk:anchor (dbk:anchor) = dbk:anchor *
+ + dbk:annotation (dbk:annotation) = dbk:annotation *
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
+ + dbk:phrase (dbk:phrase) = dbk:phrase
+ + dbk:remark (dbk:remark) = dbk:remark *
+
+[dbk:tfoot] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:row (dbk:row) = dbk:row *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+ - valign (String) 
+
+[dbk:tgroup] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
+ + dbk:tbody (dbk:tbody) = dbk:tbody
+ + dbk:tfoot (dbk:tfoot) = dbk:tfoot
+ + dbk:thead (dbk:thead) = dbk:thead
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - cols (String) 
+ - colsep (String) 
+ - rowsep (String) 
+ - tgroupstyle (String) 
+
+[dbk:thead] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:colspec (dbk:colspec) = dbk:colspec *
+ + dbk:row (dbk:row) = dbk:row *
+ - align (String) 
+ - char (String) 
+ - charoff (String) 
+ - class (String) 
+ - lang (String) 
+ - onclick (String) 
+ - ondblclick (String) 
+ - onkeydown (String) 
+ - onkeypress (String) 
+ - onkeyup (String) 
+ - onmousedown (String) 
+ - onmousemove (String) 
+ - onmouseout (String) 
+ - onmouseover (String) 
+ - onmouseup (String) 
+ - style (String) 
+ - title (String) 
+ - valign (String) 
+
+[dbk:title] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
+
+[dbk:videodata] > argeodbk:base
+ + dbk:info (dbk:info) = dbk:info
+ - align (String) 
+ - contentdepth (String) 
+ - contentwidth (String) 
+ - depth (String) 
+ - entityref (String) 
+ - fileref (String) 
+ - format (String) 
+ - scale (String) 
+ - scalefit (String) 
+ - valign (String) 
+ - width (String) 
+
+[dbk:videoobject] > argeodbk:base, argeodbk:linkingAttributes
+ + dbk:info (dbk:info) = dbk:info
+ + dbk:videodata (dbk:videodata) = dbk:videodata
+
+[dbk:xref] > argeodbk:base, argeodbk:linkingAttributes
+ - endterm (Reference) 
+ - xrefstyle (String) 
+
+
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/entity.cnd b/org.argeo.app.jcr/src/org/argeo/app/jcr/entity.cnd
new file mode 100644 (file)
index 0000000..9da2af7
--- /dev/null
@@ -0,0 +1,126 @@
+// Standard namespaces
+<xsd = "http://www.w3.org/2001/XMLSchema">
+<h = "http://www.w3.org/1999/xhtml">
+// see https://www.w3.org/2003/01/geo/
+<geo = "http://www.w3.org/2003/01/geo/wgs84_pos#">
+<svg = "http://www.w3.org/2000/svg">
+<gml = "http://www.opengis.net/gml/3.2">
+
+<ldap = "http://www.argeo.org/ns/ldap">
+<entity = 'http://www.argeo.org/ns/entity'>
+
+[entity:entity] > mix:created, mix:referenceable
+mixin
+
+[entity:local] > entity:entity
+mixin
+- entity:type (String) m
+
+[entity:relatedTo]
+mixin
++ entity:relatedTo (nt:address) *
+
+//
+// ENTITY DEFINITION
+//
+//[entity:definition] > entity:composite, mix:created, mix:lastModified, mix:referenceable
+//- entity:type (String) multiple
+
+//[entity:part]
+
+//[entity:reference]
+
+//[entity:composite]
+//orderable
+//+ * (entity:part)
+//+ * (entity:reference)
+//+ * (entity:composite)
+
+[entity:query] > nt:query, mix:referenceable
+
+[entity:querySet]
++ * (entity:query) = entity:query *
+
+//
+// STRUCTURE
+//
+[entity:space]
+mixin
+
+[entity:document]
+mixin
+
+//
+// TYPOLOGY
+//
+[entity:typologies]
++ * (entity:terms) = entity:terms
+
+[entity:term]
+orderable
+- name (NAME)
+- * (*)
++ term (entity:term) = entity:term *
+
+[entity:terms] > mix:referenceable
+orderable
++ term (entity:term) = entity:term *
+
+//
+// FORM
+//
+[entity:form]
+mixin
++ queries (entity:querySet) = entity:querySet
+
+[entity:formSubmission]
+mixin
+
+[entity:formSet] > mix:title
+mixin
+
+//
+// GRAPHICS
+//
+[entity:box]
+mixin
+- svg:width (DOUBLE)
+- svg:height (DOUBLE)
+- svg:length (DOUBLE)
+- svg:unit (STRING)
+- svg:dur (DOUBLE)
+
+// LDAP-LIKE ENTITIES
+// A real person
+[entity:person] > entity:entity
+mixin
+- ldap:sn (String)
+- ldap:givenName (String)
+- ldap:cn (String)
+- ldap:mail (String) *
+- ldap:description (String)
+
+[entity:user] > entity:person
+mixin
+- ldap:distinguishedName (String)
+- ldap:uid (String)
+
+// GEOGRAPHY
+[entity:geopoint]
+mixin
+- geo:long (DOUBLE)
+- geo:lat (DOUBLE)
+- geo:alt (DOUBLE)
+
+[entity:bearing]
+mixin
+- svg:direction (DOUBLE)
+
+[entity:geobounded]
+mixin
+- entity:minLat (DOUBLE)
+- entity:minLon (DOUBLE)
+- entity:maxLat (DOUBLE)
+- entity:maxLon (DOUBLE)
+- entity:minAlt (DOUBLE)
+- entity:maxAlt (DOUBLE)
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/odk/OdkJcrUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/odk/OdkJcrUtils.java
new file mode 100644 (file)
index 0000000..3b608e1
--- /dev/null
@@ -0,0 +1,196 @@
+package org.argeo.app.jcr.odk;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.api.app.EntityMimeType;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.odk.OdkNames;
+import org.argeo.app.odk.OrxListName;
+import org.argeo.app.odk.OrxManifestName;
+import org.argeo.cms.util.DigestUtils;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.JcrxApi;
+
+/** Utilities around ODK. */
+public class OdkJcrUtils {
+       private final static CmsLog log = CmsLog.getLog(OdkJcrUtils.class);
+
+       public static Node loadOdkForm(Node formBase, String name, InputStream in, InputStream... additionalNodes)
+                       throws RepositoryException, IOException {
+               if (!formBase.isNodeType(EntityType.formSet.get()))
+                       throw new IllegalArgumentException(
+                                       "Parent path " + formBase + " must be of type " + EntityType.formSet.get());
+               Node form = JcrUtils.getOrAdd(formBase, name, OrxListName.xform.get(), NodeType.MIX_VERSIONABLE);
+
+               String previousCsum = JcrxApi.getChecksum(form, JcrxApi.MD5);
+               String previousFormId = Jcr.get(form, OrxListName.formID.get());
+               String previousFormVersion = Jcr.get(form, OrxListName.version.get());
+
+               Session s = formBase.getSession();
+               s.importXML(form.getPath(), in, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+
+               for (InputStream additionalIn : additionalNodes) {
+                       s.importXML(form.getPath(), additionalIn, ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+               }
+               s.save();
+
+               // manage instances
+               // NodeIterator instances =
+               // form.getNodes("h:html/h:head/xforms:model/xforms:instance");
+               NodeIterator instances = form.getNode("h:html/h:head/xforms:model").getNodes("xforms:instance");
+               Node primaryInstance = null;
+               while (instances.hasNext()) {
+                       Node instance = instances.nextNode();
+                       if (primaryInstance == null) {
+                               primaryInstance = instance;
+                       } else {// secondary instances
+                               String instanceId = instance.getProperty("id").getString();
+                               URI instanceUri = null;
+                               if (instance.hasProperty("src"))
+                                       try {
+                                               instanceUri = new URI(instance.getProperty("src").getString());
+                                       } catch (URISyntaxException e) {
+                                               throw new IllegalArgumentException("Instance " + instanceId + " has a badly formatted URI", e);
+                                       }
+                               if (instanceUri != null) {
+                                       if ("jr".equals(instanceUri.getScheme())) {
+                                               String uuid;
+                                               String mimeType;
+                                               String encoding = StandardCharsets.UTF_8.name();
+                                               String type = instanceUri.getHost();
+                                               String path = instanceUri.getPath();
+                                               if ("file".equals(type)) {
+                                                       if (!path.endsWith(".xml"))
+                                                               throw new IllegalArgumentException("File uri " + instanceUri + " must end with .xml");
+                                                       // Work around bug in ODK Collect not supporting paths
+                                                       // path = path.substring(0, path.length() - ".xml".length());
+                                                       // Node target = file.getSession().getNode(path);
+                                                       uuid = path.substring(1, path.length() - ".xml".length());
+                                                       mimeType = EntityMimeType.XML.getMimeType();
+                                               } else if ("file-csv".equals(type)) {
+                                                       if (!path.endsWith(".csv"))
+                                                               throw new IllegalArgumentException("File uri " + instanceUri + " must end with .csv");
+                                                       // Work around bug in ODK Collect not supporting paths
+                                                       // path = path.substring(0, path.length() - ".csv".length());
+                                                       // Node target = file.getSession().getNode(path);
+                                                       uuid = path.substring(1, path.length() - ".csv".length());
+                                                       mimeType = EntityMimeType.CSV.getMimeType();
+                                               } else {
+                                                       throw new IllegalArgumentException("Unsupported instance type " + type);
+                                               }
+                                               Node manifest = JcrUtils.getOrAdd(form, OrxManifestName.manifest.name(),
+                                                               OrxManifestName.manifest.get());
+                                               Node file = JcrUtils.getOrAdd(manifest, instanceId);
+                                               file.addMixin(NodeType.MIX_MIMETYPE);
+                                               file.setProperty(Property.JCR_MIMETYPE, mimeType);
+                                               file.setProperty(Property.JCR_ENCODING, encoding);
+                                               Node target = file.getSession().getNodeByIdentifier(uuid);
+
+//                                             if (target.isNodeType(NodeType.NT_QUERY)) {
+//                                                     Query query = target.getSession().getWorkspace().getQueryManager().getQuery(target);
+//                                                     query.setLimit(10);
+//                                                     QueryResult queryResult = query.execute();
+//                                                     RowIterator rit = queryResult.getRows();
+//                                                     while (rit.hasNext()) {
+//                                                             Row row = rit.nextRow();
+//                                                             for (Value value : row.getValues()) {
+//                                                                     System.out.print(value.getString());
+//                                                                     System.out.print(',');
+//                                                             }
+//                                                             System.out.print('\n');
+//                                                     }
+//
+//                                             }
+
+                                               if (target.isNodeType(NodeType.MIX_REFERENCEABLE)) {
+                                                       file.setProperty(Property.JCR_ID, target);
+                                                       if (file.hasProperty(Property.JCR_PATH))
+                                                               file.getProperty(Property.JCR_PATH).remove();
+                                               } else {
+                                                       file.setProperty(Property.JCR_PATH, target.getPath());
+                                                       if (file.hasProperty(Property.JCR_ID))
+                                                               file.getProperty(Property.JCR_ID).remove();
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               if (primaryInstance == null)
+                       throw new IllegalArgumentException("No primary instance found in " + form);
+               if (!primaryInstance.hasNodes())
+                       throw new IllegalArgumentException("No data found in primary instance of " + form);
+               NodeIterator primaryInstanceChildren = primaryInstance.getNodes();
+               Node data = primaryInstanceChildren.nextNode();
+               if (primaryInstanceChildren.hasNext())
+                       throw new IllegalArgumentException("More than one data found in primary instance of " + form);
+               String formId = data.getProperty("id").getString();
+               if (previousFormId != null && !formId.equals(previousFormId))
+                       log.warn("Form id of " + form + " changed from " + previousFormId + " to " + formId);
+               form.setProperty(OrxListName.formID.get(), formId);
+               String formVersion = data.getProperty("version").getString();
+
+               if (previousCsum == null)// save before checksuming
+                       s.save();
+               String newCsum;
+               try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+                       s.exportDocumentView(form.getPath() + "/" + OdkNames.H_HTML, out, true, false);
+                       newCsum = DigestUtils.digest(DigestUtils.MD5, out.toByteArray());
+               }
+               if (previousCsum == null) {
+                       JcrxApi.addChecksum(form, newCsum);
+                       JcrUtils.updateLastModified(form);
+                       form.setProperty(OrxListName.version.get(), formVersion);
+                       s.save();
+                       s.getWorkspace().getVersionManager().checkpoint(form.getPath());
+                       if (log.isDebugEnabled())
+                               log.debug("New form " + form);
+               } else {
+                       if (newCsum.equals(previousCsum)) {
+                               // discard
+                               s.refresh(false);
+                               if (log.isDebugEnabled())
+                                       log.debug("Unmodified form " + form);
+                               return form;
+                       } else {
+                               if (formVersion.equals(previousFormVersion)) {
+                                       s.refresh(false);
+                                       throw new IllegalArgumentException("Form " + form + " has been changed but version " + formVersion
+                                                       + " has not been changed, discarding changes...");
+                               }
+                               form.setProperty(OrxListName.version.get(), formVersion);
+                               JcrxApi.addChecksum(form, newCsum);
+                               JcrUtils.updateLastModified(form);
+                               s.save();
+                               s.getWorkspace().getVersionManager().checkpoint(form.getPath());
+                               if (log.isDebugEnabled()) {
+                                       log.debug("Updated form " + form);
+                                       log.debug("Previous csum " + previousCsum);
+                                       log.debug("New csum " + newCsum);
+                               }
+                       }
+               }
+               return form;
+       }
+
+       /** Singleton. */
+       private OdkJcrUtils() {
+
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/odk/odk.cnd b/org.argeo.app.jcr/src/org/argeo/app/jcr/odk/odk.cnd
new file mode 100644 (file)
index 0000000..d80096d
--- /dev/null
@@ -0,0 +1,56 @@
+<jr = "http://openrosa.org/javarosa">
+<orx = "http://openrosa.org/xforms">
+<orxList = "http://openrosa.org/xforms/xformsList">
+<orxManifest = "http://openrosa.org/xforms/xformsManifest">
+<odk = "http://www.opendatakit.org/xforms">
+
+
+[odk:head]
++ h:title (jcrx:xmlvalue) = jcrx:xmlvalue
++ xforms:model (odk:model) = odk:model
+
+[odk:body] > xforms:ui
+
+
+[odk:html] > mix:referenceable
++ h:head (odk:head) = odk:head
++ h:body (odk:body) = odk:body
+
+[odk:model] > xforms:model
++ odk:setgeopoint (odk:setgeopoint) = odk:setgeopoint
++ xforms:itext (odk:itext) = odk:itext
+
+[odk:itext]
++ xforms:translation (odk:translation) = odk:translation *
+
+[odk:translation]
+- lang (STRING) m
+- default (STRING)
++ xforms:text (odk:text) = odk:text *
+
+[odk:text]
+- id (STRING) m
++ xforms:value (jcrx:xmlvalue) = jcrx:xmlvalue
+
+[odk:setgeopoint]
+- event (STRING)
+- ref (STRING)
+
+// OpenRosa web API
+
+[orxList:xform] > mix:created, mix:lastModified, jcrx:csum, entity:form
+- orxList:formID (STRING)
+- orxList:version (STRING)
++ h:html (odk:html) = odk:html
++ manifest (orxManifest:manifest) = orxManifest:manifest
+
+[orxManifest:manifest]
++ * (orxManifest:mediaFile) = orxManifest:mediaFile
+
+[orxManifest:mediaFile] > nt:address, jcrx:csum
+
+[orx:submission] > mix:created, entity:formSubmission
++ xml_submission_file (nt:unstructured) = nt:unstructured
++ * (nt:file) *
+
+
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTerm.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTerm.java
new file mode 100644 (file)
index 0000000..958b545
--- /dev/null
@@ -0,0 +1,62 @@
+package org.argeo.app.jcr.terms;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.api.app.Term;
+
+/**
+ * A single term. Helper to optimise {@link SuiteTermsManager} implementation.
+ */
+class SuiteTerm implements Term {
+       private final String name;
+       private final String relativePath;
+       private final SuiteTypology typology;
+       private final String id;
+
+       private final SuiteTerm parentTerm;
+       private final List<SuiteTerm> subTerms = new ArrayList<>();
+
+       SuiteTerm(SuiteTypology typology, String relativePath, SuiteTerm parentTerm) {
+               this.typology = typology;
+               this.parentTerm = parentTerm;
+               this.relativePath = relativePath;
+               int index = relativePath.lastIndexOf('/');
+               if (index > 0) {
+                       this.name = relativePath.substring(index + 1);
+               } else {
+                       this.name = relativePath;
+               }
+               id = typology.getName() + '/' + relativePath;
+       }
+
+       @Override
+       public String getId() {
+               return id;
+       }
+
+       @Override
+       public String getName() {
+               return name;
+       }
+
+       public String getRelativePath() {
+               return relativePath;
+       }
+
+       @Override
+       public SuiteTypology getTypology() {
+               return typology;
+       }
+
+       @Override
+       public List<SuiteTerm> getSubTerms() {
+               return subTerms;
+       }
+
+       @Override
+       public SuiteTerm getParentTerm() {
+               return parentTerm;
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTermsManager.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTermsManager.java
new file mode 100644 (file)
index 0000000..30ecb76
--- /dev/null
@@ -0,0 +1,117 @@
+package org.argeo.app.jcr.terms;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.argeo.api.app.EntityNames;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.api.app.Typology;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.cms.jcr.CmsJcrUtils;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+
+/** Argeo Suite implementation of terms manager. */
+public class SuiteTermsManager implements TermsManager {
+       private final Map<String, SuiteTerm> terms = new HashMap<>();
+       private final Map<String, SuiteTypology> typologies = new HashMap<>();
+
+       // JCR
+       private Repository repository;
+       private Session adminSession;
+
+       public void init() {
+               adminSession = CmsJcrUtils.openDataAdminSession(repository, CmsConstants.SYS_WORKSPACE);
+       }
+
+       @Override
+       public List<Term> listAllTerms(String typology) {
+               List<Term> res = new ArrayList<>();
+               SuiteTypology t = getTypology(typology);
+               for (SuiteTerm term : t.getAllTerms()) {
+                       res.add(term);
+               }
+               return res;
+       }
+
+       @Override
+       public SuiteTerm getTerm(String termId) {
+               return terms.get(termId);
+       }
+
+       @Override
+       public SuiteTypology getTypology(String typology) {
+               SuiteTypology t = typologies.get(typology);
+               if (t == null) {
+                       Node termsNode = Jcr.getNode(adminSession, "SELECT * FROM [{0}] WHERE NAME()=\"{1}\"",
+                                       EntityType.terms.get(), typology);
+                       if (termsNode == null)
+                               throw new IllegalArgumentException("Typology " + typology + " not found.");
+                       t = loadTypology(termsNode);
+               }
+               return t;
+       }
+
+       @Override
+       public Set<Typology> getTypologies() {
+               Set<Typology> res = new TreeSet<>((o1, o2) -> o1.getId().compareTo(o2.getId()));
+               NodeIterator termsNodes = Jcr.executeQuery(adminSession, "SELECT * FROM [{0}]", EntityType.terms.get());
+               for (Node termsNode : Jcr.iterate(termsNodes)) {
+                       res.add(loadTypology(termsNode));
+               }
+               return res;
+       }
+
+       SuiteTypology loadTypology(Node termsNode) {
+               try {
+                       SuiteTypology typology = new SuiteTypology(termsNode);
+                       for (Node termNode : Jcr.iterate(termsNode.getNodes())) {
+                               if (termNode.isNodeType(EntityType.term.get())) {
+                                       SuiteTerm term = loadTerm(typology, termNode, null);
+                                       if (!term.getSubTerms().isEmpty())
+                                               typology.markNotFlat();
+                                       typology.getSubTerms().add(term);
+                               }
+                       }
+                       typologies.put(typology.getName(), typology);
+                       return typology;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot load typology from " + termsNode, e);
+               }
+       }
+
+       SuiteTerm loadTerm(SuiteTypology typology, Node termNode, SuiteTerm parentTerm) throws RepositoryException {
+               String name = termNode.getProperty(EntityNames.NAME).getString();
+               String relativePath = parentTerm == null ? name : parentTerm.getRelativePath() + '/' + name;
+               SuiteTerm term = new SuiteTerm(typology, relativePath, parentTerm);
+               terms.put(term.getId(), term);
+               for (Node subTermNode : Jcr.iterate(termNode.getNodes())) {
+                       if (termNode.isNodeType(EntityType.term.get())) {
+                               SuiteTerm subTerm = loadTerm(typology, subTermNode, term);
+                               term.getSubTerms().add(subTerm);
+                       }
+               }
+               return term;
+       }
+
+       public void destroy() {
+               Jcr.logout(adminSession);
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTypology.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/terms/SuiteTypology.java
new file mode 100644 (file)
index 0000000..b0095be
--- /dev/null
@@ -0,0 +1,95 @@
+package org.argeo.app.jcr.terms;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+
+import org.argeo.api.app.Term;
+import org.argeo.api.app.Typology;
+import org.argeo.jcr.Jcr;
+
+/** A typology. Helper to optimise {@link SuiteTermsManager} implementation. */
+class SuiteTypology implements Typology {
+       private final String name;
+       private final Node node;
+       private boolean isFlat = true;
+
+       private final List<SuiteTerm> subTerms = new ArrayList<>();
+
+       public SuiteTypology(Node node) {
+               this.node = node;
+               this.name = Jcr.getName(this.node);
+       }
+
+       @Override
+       public String getId() {
+               return name;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public Node getNode() {
+               return node;
+       }
+
+       void markNotFlat() {
+               if (isFlat)
+                       isFlat = false;
+       }
+
+       @Override
+       public boolean isFlat() {
+               return isFlat;
+       }
+
+       @Override
+       public List<SuiteTerm> getSubTerms() {
+               return subTerms;
+       }
+
+       public List<SuiteTerm> getAllTerms() {
+               if (isFlat)
+                       return subTerms;
+               else {
+                       List<SuiteTerm> terms = new ArrayList<>();
+                       for (SuiteTerm subTerm : subTerms) {
+                               terms.add(subTerm);
+                               collectSubTerms(terms, subTerm);
+                       }
+                       return terms;
+               }
+       }
+
+       public Term findTermByName(String name) {
+               List<SuiteTerm> collected = new ArrayList<>();
+               for (SuiteTerm subTerm : subTerms) {
+                       collectTermsByName(subTerm, name, collected);
+               }
+               if (collected.isEmpty())
+                       return null;
+               if (collected.size() == 1)
+                       return collected.get(0);
+               throw new IllegalArgumentException(
+                               "There are " + collected.size() + " terms with name " + name + " in typology " + getId());
+       }
+
+       private void collectTermsByName(SuiteTerm term, String name, List<SuiteTerm> collected) {
+               if (term.getName().equals(name)) {
+                       collected.add(term);
+               }
+               for (SuiteTerm subTerm : term.getSubTerms()) {
+                       collectTermsByName(subTerm, name, collected);
+               }
+       }
+
+       private void collectSubTerms(List<SuiteTerm> terms, SuiteTerm term) {
+               for (SuiteTerm subTerm : term.getSubTerms()) {
+                       terms.add(subTerm);
+                       collectSubTerms(terms, subTerm);
+               }
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/xforms/XFormsJcrUtils.java b/org.argeo.app.jcr/src/org/argeo/app/jcr/xforms/XFormsJcrUtils.java
new file mode 100644 (file)
index 0000000..890cac0
--- /dev/null
@@ -0,0 +1,10 @@
+package org.argeo.app.jcr.xforms;
+
+/** Empty for the time being. */
+public class XFormsJcrUtils {
+
+       /** singleton */
+       private XFormsJcrUtils() {
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/app/jcr/xforms/xforms.cnd b/org.argeo.app.jcr/src/org/argeo/app/jcr/xforms/xforms.cnd
new file mode 100644 (file)
index 0000000..9d4dc51
--- /dev/null
@@ -0,0 +1,40 @@
+<xforms = "http://www.w3.org/2002/xforms">
+
+[xforms:model]
++ xforms:instance (xforms:instance) = xforms:instance *
++ xforms:bind (xforms:bind) = xforms:bind *
++ xforms:setvalue (xforms:setvalue) = xforms:setvalue *
+
+[xforms:instance] > nt:unstructured
+
+[xforms:bind]
+- * (STRING)
+
+[xforms:setvalue]
+- * (STRING)
+
+[xforms:select] > xforms:input
++ xforms:itemset (xforms:itemset) = xforms:itemset
+
+[xforms:itemset]
+- nodeset (STRING)
++ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue
++ xforms:value (jcrx:xmlvalue) = jcrx:xmlvalue
+
+[xforms:ui]
+- * (STRING)
++ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue *
++ xforms:hint (jcrx:xmlvalue) = jcrx:xmlvalue *
++ xforms:input (xforms:input) = xforms:input *
++ xforms:select (xforms:select) = xforms:select *
++ xforms:select1 (xforms:select) = xforms:select *
++ xforms:trigger (xforms:input) = xforms:input *
++ xforms:upload (xforms:input) = xforms:input *
++ xforms:group (xforms:ui) = xforms:ui *
++ xforms:repeat (xforms:ui) = xforms:ui *
+
+[xforms:input]
+- * (STRING)
++ xforms:label (jcrx:xmlvalue) = jcrx:xmlvalue
++ xforms:hint (jcrx:xmlvalue) = jcrx:xmlvalue *
++ xforms:setvalue (xforms:setvalue) = xforms:setvalue *
diff --git a/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/AppUserStateImpl.java
new file mode 100644 (file)
index 0000000..11c42d3
--- /dev/null
@@ -0,0 +1,40 @@
+package org.argeo.internal.app.jcr;
+
+import javax.jcr.Node;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentRepository;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.app.AppUserState;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.app.jcr.SuiteJcrUtils;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.jcr.acr.JcrContentProvider;
+import org.argeo.jcr.Jcr;
+
+public class AppUserStateImpl implements AppUserState {
+       private ContentRepository contentRepository;
+       private JcrContentProvider jcrContentProvider;
+
+       @SuppressWarnings("deprecation")
+       @Override
+       public Content getOrCreateSessionDir(CmsSession session) {
+               Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> {
+                       Node node = SuiteJcrUtils.getOrCreateCmsSessionNode(adminSession, session);
+                       return node;
+               });             
+               ContentSession contentSession = ContentUtils.openSession(contentRepository, session); 
+               Content userDir = contentSession.get(Content.ROOT_PATH + CmsConstants.SYS_WORKSPACE + Jcr.getPath(userDirNode));
+               return userDir;
+       }
+
+       public void setJcrContentProvider(JcrContentProvider jcrContentProvider) {
+               this.jcrContentProvider = jcrContentProvider;
+       }
+
+       public void setContentRepository(ContentRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+
+}
diff --git a/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/SuiteMaintenanceService.java b/org.argeo.app.jcr/src/org/argeo/internal/app/jcr/SuiteMaintenanceService.java
new file mode 100644 (file)
index 0000000..b0198a0
--- /dev/null
@@ -0,0 +1,39 @@
+package org.argeo.internal.app.jcr;
+
+import java.io.IOException;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.security.Privilege;
+
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.maintenance.AbstractMaintenanceService;
+
+/** Initialises JCR in an Argeo Suite backend. */
+public class SuiteMaintenanceService extends AbstractMaintenanceService {
+       @Override
+       public boolean prepareJcrTree(Session adminSession) throws RepositoryException, IOException {
+               boolean modified = false;
+               Node rootNode = adminSession.getRootNode();
+               if (!rootNode.hasNode(EntityType.user.name())) {
+                       rootNode.addNode(EntityType.user.name(), NodeType.NT_UNSTRUCTURED);
+                       modified = true;
+               }
+               if (modified)
+                       adminSession.save();
+               return modified;
+       }
+
+       @Override
+       public void configurePrivileges(Session adminSession) throws RepositoryException {
+               JcrUtils.addPrivilege(adminSession, EntityType.user.basePath(), CmsConstants.ROLE_USER_ADMIN,
+                               Privilege.JCR_ALL);
+               // JcrUtils.addPrivilege(adminSession, "/", SuiteRole.coworker.dn(),
+               // Privilege.JCR_READ);
+       }
+
+}
diff --git a/org.argeo.app.profile.acr.fs/.classpath b/org.argeo.app.profile.acr.fs/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.profile.acr.fs/.project b/org.argeo.app.profile.acr.fs/.project
new file mode 100644 (file)
index 0000000..bc3f767
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.profile.acr.fs</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.profile.acr.fs/OSGI-INF/srvContentProvider.xml b/org.argeo.app.profile.acr.fs/OSGI-INF/srvContentProvider.xml
new file mode 100644 (file)
index 0000000..debf19c
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" immediate="true" name="argeo.app.srvContentProvider">
+   <implementation class="org.argeo.cms.acr.fs.FsContentProviderService"/>
+   <reference bind="setCmsState" cardinality="1..1" interface="org.argeo.api.cms.CmsState" policy="static" />
+   <property name="acr.mount.path" type="String" value="/srv"/>
+   <service>
+      <provide interface="org.argeo.api.acr.spi.ContentProvider"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.app.profile.acr.fs/OSGI-INF/sysContentProvider.xml b/org.argeo.app.profile.acr.fs/OSGI-INF/sysContentProvider.xml
new file mode 100644 (file)
index 0000000..0cbc7f0
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="argeo.app.sysContentProvider">
+   <implementation class="org.argeo.cms.jcr.acr.JcrContentProvider"/>
+   <reference bind="setJcrRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+   <property name="acr.mount.path" type="String" value="/sys"/>
+   <service>
+      <provide interface="org.argeo.api.acr.spi.ContentProvider"/>
+      <provide interface="org.argeo.cms.jcr.acr.JcrContentProvider"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.app.profile.acr.fs/bnd.bnd b/org.argeo.app.profile.acr.fs/bnd.bnd
new file mode 100644 (file)
index 0000000..f976da0
--- /dev/null
@@ -0,0 +1,8 @@
+Import-Package: \
+org.argeo.cms.acr.fs,\
+org.argeo.cms.jcr.acr,\
+*
+
+Service-Component:\
+OSGI-INF/sysContentProvider.xml,\
+OSGI-INF/srvContentProvider.xml,\
diff --git a/org.argeo.app.profile.acr.fs/build.properties b/org.argeo.app.profile.acr.fs/build.properties
new file mode 100644 (file)
index 0000000..c58ea21
--- /dev/null
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
diff --git a/org.argeo.app.profile.acr.fs/src/.gitignore b/org.argeo.app.profile.acr.fs/src/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.app.profile.acr.jcr/.classpath b/org.argeo.app.profile.acr.jcr/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.profile.acr.jcr/.project b/org.argeo.app.profile.acr.jcr/.project
new file mode 100644 (file)
index 0000000..632c90e
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.profile.acr.jcr</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.profile.acr.jcr/OSGI-INF/srvContentProvider.xml b/org.argeo.app.profile.acr.jcr/OSGI-INF/srvContentProvider.xml
new file mode 100644 (file)
index 0000000..704fec7
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="argeo.app.srvContentProvider">
+   <implementation class="org.argeo.cms.jcr.acr.JcrContentProvider"/>
+   <reference bind="setJcrRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+   <property name="acr.mount.path" type="String" value="/srv"/>
+   <service>
+      <provide interface="org.argeo.api.acr.spi.ContentProvider"/>
+      <provide interface="org.argeo.cms.jcr.acr.JcrContentProvider"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.app.profile.acr.jcr/OSGI-INF/sysContentProvider.xml b/org.argeo.app.profile.acr.jcr/OSGI-INF/sysContentProvider.xml
new file mode 100644 (file)
index 0000000..0cbc7f0
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="argeo.app.sysContentProvider">
+   <implementation class="org.argeo.cms.jcr.acr.JcrContentProvider"/>
+   <reference bind="setJcrRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+   <property name="acr.mount.path" type="String" value="/sys"/>
+   <service>
+      <provide interface="org.argeo.api.acr.spi.ContentProvider"/>
+      <provide interface="org.argeo.cms.jcr.acr.JcrContentProvider"/>
+   </service>
+</scr:component>
diff --git a/org.argeo.app.profile.acr.jcr/bnd.bnd b/org.argeo.app.profile.acr.jcr/bnd.bnd
new file mode 100644 (file)
index 0000000..625b5f4
--- /dev/null
@@ -0,0 +1,7 @@
+Import-Package: \
+org.argeo.cms.jcr.acr,\
+*
+
+Service-Component:\
+OSGI-INF/sysContentProvider.xml,\
+OSGI-INF/srvContentProvider.xml,\
diff --git a/org.argeo.app.profile.acr.jcr/build.properties b/org.argeo.app.profile.acr.jcr/build.properties
new file mode 100644 (file)
index 0000000..c58ea21
--- /dev/null
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
diff --git a/org.argeo.app.profile.acr.jcr/src/.gitignore b/org.argeo.app.profile.acr.jcr/src/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.app.servlet.odk/.classpath b/org.argeo.app.servlet.odk/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.servlet.odk/.gitignore b/org.argeo.app.servlet.odk/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.argeo.app.servlet.odk/.project b/org.argeo.app.servlet.odk/.project
new file mode 100644 (file)
index 0000000..d427e5d
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.servlet.odk</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.servlet.odk/META-INF/.gitignore b/org.argeo.app.servlet.odk/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkFormListServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkFormListServlet.xml
new file mode 100644 (file)
index 0000000..3430eda
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Form List Servlet">
+   <implementation class="org.argeo.app.servlet.odk.OdkFormListServlet"/>
+   <service>
+      <provide interface="javax.servlet.Servlet"/>
+   </service>
+   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/formList/*"/>
+   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkFormServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkFormServlet.xml
new file mode 100644 (file)
index 0000000..82ed712
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Form Servlet">
+   <implementation class="org.argeo.app.servlet.odk.OdkFormServlet"/>
+   <service>
+      <provide interface="javax.servlet.Servlet"/>
+   </service>
+   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/form/*"/>
+   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkManifestServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkManifestServlet.xml
new file mode 100644 (file)
index 0000000..6cac13e
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Manifest Servlet">
+   <implementation class="org.argeo.app.servlet.odk.OdkManifestServlet"/>
+   <service>
+      <provide interface="javax.servlet.Servlet"/>
+   </service>
+   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/formManifest/*"/>
+   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkServletContext.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkServletContext.xml
new file mode 100644 (file)
index 0000000..6cb17ea
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="ODK Servlet Context">
+   <implementation class="org.argeo.app.servlet.odk.OdkServletContext"/>
+   <service>
+      <provide interface="org.osgi.service.http.context.ServletContextHelper"/>
+   </service>
+   <property name="osgi.http.whiteboard.context.name" type="String" value="odkServletContext"/>
+   <property name="osgi.http.whiteboard.context.path" type="String" value="/api/odk"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml b/org.argeo.app.servlet.odk/OSGI-INF/odkSubmissionServlet.xml
new file mode 100644 (file)
index 0000000..29ff8ba
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ODK Submission Servlet">
+   <implementation class="org.argeo.app.servlet.odk.OdkSubmissionServlet"/>
+   <service>
+      <provide interface="javax.servlet.Servlet"/>
+   </service>
+   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/submission"/>
+   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=odkServletContext)"/>
+   <property name="osgi.http.whiteboard.servlet.multipart.enabled" type="String" value="true"/>
+   <reference bind="addSubmissionListener" cardinality="0..n" interface="org.argeo.app.xforms.FormSubmissionListener" name="FormSubmissionListener" policy="dynamic" unbind="removeSubmissionListener"/>
+   <reference bind="setAppUserState" cardinality="1..1" interface="org.argeo.api.app.AppUserState" name="AppUserState" policy="static"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.odk/bnd.bnd b/org.argeo.app.servlet.odk/bnd.bnd
new file mode 100644 (file)
index 0000000..a32d5d3
--- /dev/null
@@ -0,0 +1,18 @@
+Require-Capability:\
+cms.datamodel;filter:="(name=entity)",\
+cms.datamodel;filter:="(name=xforms)",\
+cms.datamodel;filter:="(name=odk)",\
+
+Service-Component:\
+OSGI-INF/odkServletContext.xml,\
+OSGI-INF/odkFormListServlet.xml,\
+OSGI-INF/odkFormServlet.xml,\
+OSGI-INF/odkSubmissionServlet.xml,\
+OSGI-INF/odkManifestServlet.xml
+
+Import-Package:\
+org.osgi.service.http.context,\
+javax.jcr.nodetype,\
+javax.servlet.*;version="[3,5)",\
+org.argeo.api.acr,\
+*
diff --git a/org.argeo.app.servlet.odk/build.properties b/org.argeo.app.servlet.odk/build.properties
new file mode 100644 (file)
index 0000000..1cdf3dd
--- /dev/null
@@ -0,0 +1,6 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               OSGI-INF/odkServletContext.xml
+source.. = src/
diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormListServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormListServlet.java
new file mode 100644 (file)
index 0000000..965082c
--- /dev/null
@@ -0,0 +1,116 @@
+package org.argeo.app.servlet.odk;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.odk.OrxListName;
+import org.argeo.app.odk.OrxManifestName;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.servlet.ServletHttpRequest;
+import org.argeo.cms.servlet.ServletUtils;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrxApi;
+
+/** Lists available forms. */
+public class OdkFormListServlet extends HttpServlet {
+       private static final long serialVersionUID = 2706191315048423321L;
+       private final static CmsLog log = CmsLog.getLog(OdkFormListServlet.class);
+
+       private Repository repository;
+
+       @Override
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+               resp.setContentType("text/xml; charset=utf-8");
+               resp.setHeader("X-OpenRosa-Version", "1.0");
+               resp.setDateHeader("Date", System.currentTimeMillis());
+
+               // we force HTTPS since ODK Collect will fail anyhow when sending http
+               // cf. https://forum.getodk.org/t/authentication-for-non-https-schems/32967/4
+               StringBuilder baseServer = ServletUtils.getRequestUrlBase(req, true);
+
+               String pathInfo = req.getPathInfo();
+
+               Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, CmsConstants.SYS_WORKSPACE),
+                               new ServletHttpRequest(req));
+               Writer writer = resp.getWriter();
+               writer.append("<?xml version='1.0' encoding='UTF-8' ?>");
+               writer.append("<xforms xmlns=\"http://openrosa.org/xforms/xformsList\">");
+               try {
+
+                       Query query;
+                       if (pathInfo == null) {
+                               query = session.getWorkspace().getQueryManager()
+                                               .createQuery("SELECT * FROM [" + OrxListName.xform.get() + "]", Query.JCR_SQL2);
+                       } else {
+                               query = session.getWorkspace().getQueryManager()
+                                               .createQuery(
+                                                               "SELECT node FROM [" + OrxListName.xform.get()
+                                                                               + "] AS node WHERE ISDESCENDANTNODE (node, '" + pathInfo + "')",
+                                                               Query.JCR_SQL2);
+                       }
+                       QueryResult queryResult = query.execute();
+
+                       NodeIterator nit = queryResult.getNodes();
+                       while (nit.hasNext()) {
+                               StringBuilder sb = new StringBuilder();
+                               Node node = nit.nextNode();
+                               if (node.isNodeType(OrxListName.xform.get())) {
+                                       sb.append("<xform>");
+                                       sb.append("<formID>" + node.getProperty(OrxListName.formID.get()).getString() + "</formID>");
+                                       sb.append("<name>" + Jcr.getTitle(node) + "</name>");
+                                       sb.append("<version>" + node.getProperty(OrxListName.version.get()).getString() + "</version>");
+                                       sb.append("<hash>md5:" + JcrxApi.getChecksum(node, JcrxApi.MD5) + "</hash>");
+                                       if (node.hasProperty(Property.JCR_DESCRIPTION))
+                                               sb.append("<name>" + node.getProperty(Property.JCR_DESCRIPTION).getString() + "</name>");
+                                       sb.append("<downloadUrl>" + baseServer + "/api/odk/form" + node.getPath() + "</downloadUrl>");
+                                       if (node.hasNode(OrxManifestName.manifest.name())) {
+                                               sb.append("<manifestUrl>" + baseServer + "/api/odk/formManifest"
+                                                               + node.getNode(OrxManifestName.manifest.name()).getPath() + "</manifestUrl>");
+                                       }
+                                       sb.append("</xform>");
+                               } else if (node.isNodeType(EntityType.formSet.get())) {
+                                       sb.append("<xforms-group>");
+                                       sb.append("<groupId>" + node.getPath() + "</groupId>");
+                                       sb.append("<name>" + node.getProperty(Property.JCR_TITLE).getString() + "</name>");
+                                       sb.append("<listUrl>" + baseServer + "/api/odk/formList" + node.getPath() + "</listUrl>");
+                                       sb.append("</xforms-group>");
+                               }
+                               String str = sb.toString();
+                               if (!str.equals("")) {
+                                       if (log.isTraceEnabled())
+                                               log.trace(str);
+                                       writer.append(str);
+                               }
+                       }
+               } catch (RepositoryException e) {
+                       e.printStackTrace();
+                       // TODO error message
+                       // resp.sendError(500);
+                       resp.sendError(503);
+               } finally {
+                       Jcr.logout(session);
+               }
+               writer.append("</xforms>");
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+}
diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkFormServlet.java
new file mode 100644 (file)
index 0000000..0ccd119
--- /dev/null
@@ -0,0 +1,52 @@
+package org.argeo.app.servlet.odk;
+
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.argeo.app.odk.OdkNames;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.servlet.ServletHttpRequest;
+import org.argeo.jcr.Jcr;
+
+/** Retrieves a single form. */
+public class OdkFormServlet extends HttpServlet {
+       private static final long serialVersionUID = 7838305967987687370L;
+
+       private Repository repository;
+
+       @Override
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+               resp.setContentType("text/xml; charset=utf-8");
+
+               Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), new ServletHttpRequest(req));
+
+               String pathInfo = req.getPathInfo();
+               if (pathInfo.startsWith("//"))
+                       pathInfo = pathInfo.substring(1);
+
+               try {
+                       String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8);
+                       session.exportDocumentView(path + "/" + OdkNames.H_HTML, resp.getOutputStream(), true, false);
+               } catch (RepositoryException e) {
+                       e.printStackTrace();
+                       // TODO error message
+                       resp.sendError(500);
+               } finally {
+                       Jcr.logout(session);
+               }
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+}
diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkManifestServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkManifestServlet.java
new file mode 100644 (file)
index 0000000..e5e2de6
--- /dev/null
@@ -0,0 +1,207 @@
+package org.argeo.app.servlet.odk;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.security.DigestOutputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Value;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
+import javax.jcr.query.Row;
+import javax.jcr.query.RowIterator;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.output.NullOutputStream;
+import org.argeo.api.app.EntityMimeType;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.WGS84PosName;
+import org.argeo.app.geo.GeoShapeUtils;
+import org.argeo.app.odk.OrxManifestName;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.servlet.ServletHttpRequest;
+import org.argeo.cms.servlet.ServletUtils;
+import org.argeo.cms.util.CsvWriter;
+import org.argeo.cms.util.DigestUtils;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+
+/** Describe additional files. */
+public class OdkManifestServlet extends HttpServlet {
+       private static final long serialVersionUID = 138030510865877478L;
+
+       private Repository repository;
+
+       @Override
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+               resp.setHeader("X-OpenRosa-Version", "1.0");
+               resp.setDateHeader("Date", System.currentTimeMillis());
+
+               String pathInfo = req.getPathInfo();
+               if (pathInfo.startsWith("//"))
+                       pathInfo = pathInfo.substring(1);
+
+               // we force HTTPS since ODK Collect will fail anyhow when sending http
+               // cf. https://forum.getodk.org/t/authentication-for-non-https-schems/32967/4
+               StringBuilder baseServer = ServletUtils.getRequestUrlBase(req, true);
+
+               Session session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), new ServletHttpRequest(req));
+
+               try {
+                       Node node = session.getNode(pathInfo);
+                       if (node.isNodeType(OrxManifestName.manifest.get())) {
+                               resp.setContentType(EntityMimeType.XML.toHttpContentType());
+                               Writer writer = resp.getWriter();
+                               writer.append("<?xml version='1.0' encoding='UTF-8' ?>");
+                               writer.append("<manifest xmlns=\"http://openrosa.org/xforms/xformsManifest\">");
+                               NodeIterator nit = node.getNodes();
+                               children: while (nit.hasNext()) {
+                                       Node file = nit.nextNode();
+                                       if (file.isNodeType(OrxManifestName.mediaFile.get())) {
+                                               EntityMimeType mimeType = EntityMimeType
+                                                               .find(file.getProperty(Property.JCR_MIMETYPE).getString());
+                                               Charset charset = Charset.forName(file.getProperty(Property.JCR_ENCODING).getString());
+
+                                               if (file.isNodeType(NodeType.NT_ADDRESS)) {
+                                                       Node target;
+                                                       try {
+                                                               target = file.getProperty(Property.JCR_ID).getNode();
+                                                       } catch (ItemNotFoundException e) {
+                                                               // TODO remove old manifests
+                                                               continue children;
+                                                       }
+                                                       writer.append("<mediaFile>");
+                                                       writer.append("<filename>");
+                                                       // Work around bug in ODK Collect not supporting paths
+                                                       // writer.append(target.getPath().substring(1) + ".xml");
+                                                       writer.append(target.getIdentifier() + "." + mimeType.getDefaultExtension());
+                                                       writer.append("</filename>");
+
+                                                       MessageDigest messageDigest = MessageDigest.getInstance(DigestUtils.MD5);
+                                                       // TODO cache a temp file ?
+                                                       try (DigestOutputStream out = new DigestOutputStream(NullOutputStream.NULL_OUTPUT_STREAM,
+                                                                       messageDigest)) {
+                                                               writeMediaFile(out, target, mimeType, charset);
+                                                               writer.append("<hash>");
+                                                               writer.append("md5sum:" + DigestUtils.toHexString(out.getMessageDigest().digest()));
+                                                               writer.append("</hash>");
+                                                       }
+                                                       writer.append("<downloadUrl>" + baseServer + "/api/odk/formManifest" + file.getPath()
+                                                                       + "</downloadUrl>");
+                                               }
+                                               writer.append("</mediaFile>");
+                                       }
+                               }
+
+                               writer.append("</manifest>");
+                       } else if (node.isNodeType(OrxManifestName.mediaFile.get())) {
+                               EntityMimeType mimeType = EntityMimeType.find(node.getProperty(Property.JCR_MIMETYPE).getString());
+                               Charset charset = Charset.forName(node.getProperty(Property.JCR_ENCODING).getString());
+                               resp.setContentType(mimeType.toHttpContentType(charset));
+                               if (node.isNodeType(NodeType.NT_ADDRESS)) {
+                                       Node target = node.getProperty(Property.JCR_ID).getNode();
+
+                                       writeMediaFile(resp.getOutputStream(), target, mimeType, charset);
+                               } else {
+                                       throw new IllegalArgumentException("Unsupported node " + node);
+                               }
+                       } else {
+                               throw new IllegalArgumentException("Unsupported node " + node);
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException(e);
+               } catch (NoSuchAlgorithmException e) {
+                       throw new ServletException(e);
+               } finally {
+                       Jcr.logout(session);
+               }
+
+       }
+
+       protected void writeMediaFile(OutputStream out, Node target, EntityMimeType mimeType, Charset charset)
+                       throws RepositoryException, IOException {
+               if (target.isNodeType(NodeType.NT_QUERY)) {
+                       Query query = target.getSession().getWorkspace().getQueryManager().getQuery(target);
+                       QueryResult queryResult = query.execute();
+                       List<String> columnNames = new ArrayList<>();
+                       for (String c : queryResult.getColumnNames()) {
+                               columnNames.add(c);
+                       }
+                       // TODO make it more configurable
+                       columnNames.add("display");
+                       columnNames.add("geometry");
+
+                       if (EntityMimeType.XML.equals(mimeType)) {
+                       } else if (EntityMimeType.CSV.equals(mimeType)) {
+                               CsvWriter csvWriter = new CsvWriter(out, charset);
+                               csvWriter.writeLine(columnNames);
+                               RowIterator rit = queryResult.getRows();
+                               if (rit.hasNext()) {
+                                       while (rit.hasNext()) {
+                                               Row row = rit.nextRow();
+                                               Value[] values = row.getValues();
+                                               List<String> lst = new ArrayList<>();
+                                               for (Value value : values) {
+                                                       lst.add(value.getString());
+                                               }
+                                               // display
+                                               lst.add(row.getValue("name").getString() + " (" + row.getValue("label").getString() + ")");
+                                               Node field = row.getNode("geopoint");
+                                               if (field != null && field.isNodeType(EntityType.geopoint.get())) {
+                                                       double lat = field.getProperty(WGS84PosName.lat.get()).getDouble();
+                                                       double lon = field.getProperty(WGS84PosName.lon.get()).getDouble();
+                                                       double alt = field.hasProperty(WGS84PosName.alt.get())
+                                                                       ? field.getProperty(WGS84PosName.alt.get()).getDouble()
+                                                                       : Double.NaN;
+                                                       String geoshape = GeoShapeUtils.geoPointToGeoShape(lon, lat, alt);
+                                                       lst.add(geoshape);
+                                               }
+                                               csvWriter.writeLine(lst);
+                                       }
+                               } else {
+                                       // corner case of an empty initial database
+                                       List<String> lst = new ArrayList<>();
+                                       for (int i = 0; i < columnNames.size(); i++)
+                                               lst.add("-");
+                                       csvWriter.writeLine(lst);
+                               }
+                       }
+               } else {
+                       if (EntityMimeType.XML.equals(mimeType)) {
+                               target.getSession().exportDocumentView(target.getPath(), out, true, false);
+                       } else if (EntityMimeType.CSV.equals(mimeType)) {
+                               CsvWriter csvWriter = new CsvWriter(out, charset);
+                               csvWriter.writeLine(new String[] { "name", "label" });
+                               NodeIterator children = target.getNodes();
+                               while (children.hasNext()) {
+                                       Node child = children.nextNode();
+                                       String label = Jcr.getTitle(child);
+                                       csvWriter.writeLine(new String[] { child.getIdentifier(), label });
+                               }
+                       }
+
+               }
+
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+}
diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkServletContext.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkServletContext.java
new file mode 100644 (file)
index 0000000..9406145
--- /dev/null
@@ -0,0 +1,18 @@
+package org.argeo.app.servlet.odk;
+
+import org.argeo.cms.auth.RemoteAuthRequest;
+import org.argeo.cms.auth.RemoteAuthResponse;
+import org.argeo.cms.servlet.PrivateWwwAuthServletContext;
+
+/** ODK specific authentication (with additional headers). */
+public class OdkServletContext extends PrivateWwwAuthServletContext {
+
+       @Override
+       protected boolean authIsRequired(RemoteAuthRequest remoteAuthRequest, RemoteAuthResponse remoteAuthResponse) {
+               remoteAuthResponse.setHeader("X-OpenRosa-Version", "1.0");
+               remoteAuthResponse.setHeader("Date", Long.toString(System.currentTimeMillis()));
+               return true;
+
+       }
+
+}
diff --git a/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java b/org.argeo.app.servlet.odk/src/org/argeo/app/servlet/odk/OdkSubmissionServlet.java
new file mode 100644 (file)
index 0000000..68e701d
--- /dev/null
@@ -0,0 +1,147 @@
+package org.argeo.app.servlet.odk;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.nodetype.NodeType;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.Part;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.AppUserState;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.app.image.ImageProcessor;
+import org.argeo.app.odk.OrxType;
+import org.argeo.app.xforms.FormSubmissionListener;
+import org.argeo.cms.auth.RemoteAuthRequest;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.jcr.acr.JcrContent;
+import org.argeo.cms.servlet.ServletHttpRequest;
+import org.argeo.jcr.JcrUtils;
+
+/** Receives a form submission. */
+public class OdkSubmissionServlet extends HttpServlet {
+       private static final long serialVersionUID = 7834401404691302385L;
+       private final static CmsLog log = CmsLog.getLog(OdkSubmissionServlet.class);
+
+       private final static String XML_SUBMISSION_FILE = "xml_submission_file";
+       private final static String IS_INCOMPLETE = "*isIncomplete*";
+
+       private DateTimeFormatter submissionNameFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd-HHmmssSSS")
+                       .withZone(ZoneId.from(ZoneOffset.UTC));
+
+       private Set<FormSubmissionListener> submissionListeners = new HashSet<>();
+
+       private AppUserState appUserState;
+
+       @Override
+       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+               resp.setContentType("text/xml; charset=utf-8");
+               resp.setHeader("X-OpenRosa-Version", "1.0");
+               resp.setDateHeader("Date", System.currentTimeMillis());
+
+               RemoteAuthRequest request = new ServletHttpRequest(req);
+               CmsSession cmsSession = RemoteAuthUtils.getCmsSession(request);
+
+               boolean isIncomplete = false;
+               try {
+                       Content sessionDir = appUserState.getOrCreateSessionDir(cmsSession);
+                       Node cmsSessionNode = sessionDir.adapt(Node.class);
+                       String submissionName = submissionNameFormatter.format(Instant.now());
+                       Node submission = cmsSessionNode.addNode(submissionName, OrxType.submission.get());
+                       String submissionPath = submission.getPath();
+                       for (Part part : req.getParts()) {
+                               String partNameSane = JcrUtils.replaceInvalidChars(part.getName());
+                               if (log.isTraceEnabled())
+                                       log.trace("Part: " + part.getName() + ", " + part.getContentType());
+
+                               if (part.getName().equals(XML_SUBMISSION_FILE)) {
+                                       Node xml = submission.addNode(XML_SUBMISSION_FILE, NodeType.NT_UNSTRUCTURED);
+                                       cmsSessionNode.getSession().importXML(xml.getPath(), part.getInputStream(),
+                                                       ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+
+                               } else if (part.getName().equals(IS_INCOMPLETE)) {
+                                       isIncomplete = true;
+                                       log.debug("Form submission " + submissionPath + " is incomplete, expecting more to be uploaded...");
+                               } else {
+                                       Node fileNode;
+                                       if (part.getName().endsWith(".jpg")) {
+                                               // Fix metadata
+                                               Path temp = Files.createTempFile("image", ".jpg");
+                                               try {
+                                                       ImageProcessor imageProcessor = new ImageProcessor(() -> part.getInputStream(),
+                                                                       () -> Files.newOutputStream(temp));
+                                                       imageProcessor.process();
+                                                       fileNode = JcrUtils.copyStreamAsFile(submission, partNameSane, Files.newInputStream(temp));
+                                               } finally {
+                                                       Files.deleteIfExists(temp);
+                                               }
+                                       } else {
+                                               fileNode = JcrUtils.copyStreamAsFile(submission, partNameSane, part.getInputStream());
+                                       }
+                                       String contentType = part.getContentType();
+                                       if (contentType != null) {
+                                               fileNode.addMixin(NodeType.MIX_MIMETYPE);
+                                               fileNode.setProperty(Property.JCR_MIMETYPE, contentType);
+                                       }
+                                       if (part.getName().endsWith(".jpg") || part.getName().endsWith(".png")) {
+                                               // TODO meta data and thumbnails
+                                       }
+                               }
+                       }
+
+                       cmsSessionNode.getSession().save();
+                       try {
+                               for (FormSubmissionListener submissionListener : submissionListeners) {
+                                       submissionListener.formSubmissionReceived(JcrContent.nodeToContent(submission), isIncomplete);
+                               }
+                       } catch (Exception e) {
+                               log.error("Cannot save submission, cancelling...", e);
+                               if (cmsSessionNode.getSession().hasPendingChanges())
+                                       cmsSessionNode.getSession().refresh(false);// discard
+                               if (cmsSessionNode.getSession().itemExists(submissionPath))
+                                       submission.remove();
+                               cmsSessionNode.getSession().save();
+                               resp.setStatus(503);
+                               return;
+                       }
+
+               } catch (Exception e) {
+                       log.error("Cannot save submission", e);
+                       resp.setStatus(503);
+                       return;
+               }
+
+               resp.setStatus(201);
+               resp.getWriter().write("<OpenRosaResponse xmlns=\"http://openrosa.org/http/response\">"
+                               + "<message>Form Received!</message>" + "</OpenRosaResponse>");
+
+       }
+
+       public synchronized void addSubmissionListener(FormSubmissionListener listener) {
+               submissionListeners.add(listener);
+       }
+
+       public synchronized void removeSubmissionListener(FormSubmissionListener listener) {
+               submissionListeners.remove(listener);
+       }
+
+       public void setAppUserState(AppUserState appUserState) {
+               this.appUserState = appUserState;
+       }
+
+}
diff --git a/org.argeo.app.servlet.publish/.classpath b/org.argeo.app.servlet.publish/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.servlet.publish/.gitignore b/org.argeo.app.servlet.publish/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.argeo.app.servlet.publish/.project b/org.argeo.app.servlet.publish/.project
new file mode 100644 (file)
index 0000000..c080630
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.servlet.publish</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.servlet.publish/META-INF/.gitignore b/org.argeo.app.servlet.publish/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/org.argeo.app.servlet.publish/OSGI-INF/dbkServlet.xml b/org.argeo.app.servlet.publish/OSGI-INF/dbkServlet.xml
new file mode 100644 (file)
index 0000000..34a7dcb
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="DocBook Servlet">
+   <implementation class="org.argeo.app.servlet.publish.DbkServlet"/>
+   <service>
+      <provide interface="javax.servlet.Servlet"/>
+   </service>
+   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/dbk/*"/>
+   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=htmlServletContext)"/>"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+   <reference bind="addTheme" cardinality="0..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.publish/OSGI-INF/fontsServlet.xml b/org.argeo.app.servlet.publish/OSGI-INF/fontsServlet.xml
new file mode 100644 (file)
index 0000000..7b71008
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.servlet.publish.FontsServlet"/>
+   <service>
+      <provide interface="javax.servlet.Servlet"/>
+   </service>
+   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/fonts/*"/>
+   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=default)"/>
+   <reference bind="addTheme" cardinality="0..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.publish/OSGI-INF/htmlServletContext.xml b/org.argeo.app.servlet.publish/OSGI-INF/htmlServletContext.xml
new file mode 100644 (file)
index 0000000..e0c1f6b
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
+   <implementation class="org.argeo.cms.servlet.CmsServletContext"/>
+   <service>
+      <provide interface="org.osgi.service.http.context.ServletContextHelper"/>
+   </service>
+   <property name="osgi.http.whiteboard.context.name" type="String" value="htmlServletContext"/>
+   <property name="osgi.http.whiteboard.context.path" type="String" value="/html"/>
+</scr:component>
diff --git a/org.argeo.app.servlet.publish/OSGI-INF/l10n/bundle.properties b/org.argeo.app.servlet.publish/OSGI-INF/l10n/bundle.properties
new file mode 100644 (file)
index 0000000..302f555
--- /dev/null
@@ -0,0 +1,12 @@
+paragraph=paragraph
+section=section
+media=media
+style=style
+
+insertParagraph=insert paragraph
+deleteParagraph=delete paragraph
+deleteSection=delete section
+
+insertPicture=insert picture
+insertVideo=insert video
+deleteMedia=delete media
\ No newline at end of file
diff --git a/org.argeo.app.servlet.publish/bnd.bnd b/org.argeo.app.servlet.publish/bnd.bnd
new file mode 100644 (file)
index 0000000..935672f
--- /dev/null
@@ -0,0 +1,18 @@
+Import-Package:\
+org.apache.xmlgraphics.image.loader,\
+org.osgi.service.http.context,\
+javax.jcr.nodetype,\
+org.osgi.framework,\
+org.argeo.api.app,\
+org.argeo.cms.acr.xml,\
+javax.servlet.*;version="[3,5)",\
+*
+
+Require-Capability:\
+cms.datamodel;filter:="(name=entity)",\
+cms.datamodel;filter:="(name=docbook)",\
+
+Service-Component:\
+OSGI-INF/fontsServlet.xml,\
+OSGI-INF/htmlServletContext.xml,\
+OSGI-INF/dbkServlet.xml,\
diff --git a/org.argeo.app.servlet.publish/build.properties b/org.argeo.app.servlet.publish/build.properties
new file mode 100644 (file)
index 0000000..e97efd7
--- /dev/null
@@ -0,0 +1,7 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               OSGI-INF/documentUiProvider.xml,\
+               OSGI-INF/dbk4Converter.xml
+source.. = src/
diff --git a/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java b/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/DbkServlet.java
new file mode 100644 (file)
index 0000000..246a0c2
--- /dev/null
@@ -0,0 +1,340 @@
+package org.argeo.app.servlet.publish;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.FopFactory;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.CmsTheme;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.app.jcr.docbook.DbkJcrUtils;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.servlet.ServletHttpRequest;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
+import org.w3c.dom.Document;
+
+import net.sf.saxon.BasicTransformerFactory;
+
+/**
+ * A servlet transforming a dbk:* JCR node into HTML, using the DocBook XSL.
+ */
+public class DbkServlet extends HttpServlet {
+       private static final long serialVersionUID = 6906020513498289335L;
+
+       private CmsLog log = CmsLog.getLog(DbkServlet.class);
+
+       private Repository repository;
+
+       private DocumentBuilderFactory documentBuilderFactory;
+       private TransformerFactory transformerFactory;
+       private Templates docBoookHtmlTemplates;
+
+       // FOP
+       private Templates docBoookFoTemplates;
+
+       private Map<String, CmsTheme> themes = Collections.synchronizedMap(new HashMap<>());
+
+       private String xslBase;
+
+       @Override
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+
+               String pathInfo = req.getPathInfo();
+               if (pathInfo.startsWith("//"))
+                       pathInfo = pathInfo.substring(1);
+               String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8);
+
+               if (path.toLowerCase().endsWith(".css")) {
+                       path = path.substring(1);
+                       int firstSlash = path.indexOf('/');
+                       String themeId = path.substring(0, firstSlash);
+                       String cssPath = path.substring(firstSlash);
+                       CmsTheme cmsTheme = themes.get(themeId);
+                       if (cmsTheme == null)
+                               throw new IllegalArgumentException("Theme " + themeId + " not found.");
+                       resp.setContentType("text/css");
+                       IOUtils.copy(cmsTheme.getResourceAsStream(cssPath), resp.getOutputStream());
+                       return;
+               }
+
+               if (path.toLowerCase().endsWith("/index.html")) {
+                       path = path.substring(0, path.length() - "/index.html".length());
+               }
+
+               boolean pdf = false;
+               if (path.toLowerCase().endsWith(".pdf")) {
+                       pdf = true;
+                       if (path.toLowerCase().endsWith("/index.pdf")) {
+                               path = path.substring(0, path.length() - "/index.pdf".length());
+                       }
+               }
+
+               Session session = null;
+               try {
+                       session = RemoteAuthUtils.doAs(() -> Jcr.login(repository, null), new ServletHttpRequest(req));
+                       Node node = session.getNode(path);
+
+                       if (node.hasNode(DbkType.article.get())) {
+                               Node dbkNode = node.getNode(DbkType.article.get());
+                               if (DbkJcrUtils.isDbk(dbkNode)) {
+                                       CmsTheme cmsTheme = null;
+                                       String themeId = req.getParameter("themeId");
+                                       if (themeId != null) {
+                                               cmsTheme = themes.get(themeId);
+                                               if (cmsTheme == null)
+                                                       throw new IllegalArgumentException("Theme " + themeId + " not found.");
+                                       }
+
+                                       // TODO customise DocBook so that it outputs UTF-8
+                                       // see http://www.sagehill.net/docbookxsl/OutputEncoding.html
+                                       resp.setContentType("text/html; charset=ISO-8859-1");
+
+                                       // TODO optimise with pipes, SAX, etc. ?
+                                       byte[] arr;
+                                       try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+                                               session.exportDocumentView(dbkNode.getPath(), out, true, false);
+                                               arr = out.toByteArray();
+                                       } catch (RepositoryException e) {
+                                               throw new JcrException(e);
+                                       }
+
+                                       try (InputStream in = new ByteArrayInputStream(arr);) {
+
+                                               DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
+                                               Document doc = docBuilder.parse(in);
+                                               Source xmlInput = new DOMSource(doc);
+
+                                               if (pdf) {
+                                                       // String baseUri = req.getRequestURI();
+                                                       FopFactory fopFactory = FopFactory.newInstance(URI.create(req.getRequestURL().toString()));
+                                                       resp.setContentType("application/pdf");
+
+//                                                     // DocBook to FO
+//                                                     byte[] foBytes;
+//                                                     try (ByteArrayOutputStream out = new ByteArrayOutputStream();) {
+//                                                             Result xmlOutput = new StreamResult(out);
+//                                                             Transformer docBookTransformer = docBoookFoTemplates.newTransformer();
+//                                                             docBookTransformer.transform(xmlInput, xmlOutput);
+//                                                             foBytes = out.toByteArray();
+//                                                     }
+//
+//                                                     // FO to PDF
+//                                                     try (InputStream foIn = new ByteArrayInputStream(foBytes)) {
+//                                                             Fop fop = fopFactory.newFop("application/pdf", resp.getOutputStream());
+//                                                             Transformer fopTransformer = transformerFactory.newTransformer(); // identity
+//                                                             Source src = new StreamSource(foIn);
+//                                                             Result fopResult = new SAXResult(fop.getDefaultHandler());
+//                                                             fopTransformer.transform(src, fopResult);
+//                                                     }
+//
+
+                                                       Fop fop = fopFactory.newFop("application/pdf", resp.getOutputStream());
+                                                       Transformer docBookTransformer = getDocBoookFoTemplates().newTransformer();
+                                                       Result fopResult = new SAXResult(fop.getDefaultHandler());
+                                                       docBookTransformer.transform(xmlInput, fopResult);
+
+                                               } else {
+                                                       Result xmlOutput = new StreamResult(resp.getOutputStream());
+                                                       resp.setContentType("text/html");
+                                                       Transformer docBookTransformer = getDocBoookHtmlTemplates().newTransformer();
+
+                                                       // gather CSS
+                                                       if (cmsTheme != null) {
+                                                               StringBuilder sb = new StringBuilder();
+                                                               for (String cssPath : cmsTheme.getWebCssPaths()) {
+                                                                       sb.append(req.getContextPath()).append(req.getServletPath()).append('/');
+                                                                       sb.append(themeId).append('/').append(cssPath).append(' ');
+                                                               }
+                                                               // FIXME make it more generic
+                                                               sb.append("https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap")
+                                                                               .append(' ');
+                                                               sb.append(
+                                                                               "https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,300;0,400;0,600;1,400&display=swap")
+                                                                               .append(' ');
+                                                               if (sb.length() > 0)
+                                                                       docBookTransformer.setParameter("html.stylesheet", sb.toString());
+                                                       }
+                                                       docBookTransformer.transform(xmlInput, xmlOutput);
+                                               }
+//                             resp.getOutputStream().write(out.toByteArray());
+                                       } catch (Exception e) {
+                                               throw new ServletException("Cannot transform " + path, e);
+                                       }
+                               }
+                       } else {
+                               if (node.isNodeType(NodeType.NT_FILE)) {// media download etc.
+                                       String fileNameLowerCase = node.getName().toLowerCase();
+                                       if (fileNameLowerCase.endsWith(".jpg") || fileNameLowerCase.endsWith(".jpeg")) {
+                                               resp.setContentType("image/jpeg");
+                                       } else if (fileNameLowerCase.endsWith(".png")) {
+                                               resp.setContentType("image/png");
+                                       } else if (fileNameLowerCase.endsWith(".gif")) {
+                                               resp.setContentType("image/gif");
+                                       } else if (fileNameLowerCase.endsWith(".svg")) {
+                                               resp.setContentType("image/svg+xml");
+                                       } else {
+                                               // TODO know more content types...
+                                               resp.setHeader("Content-Disposition", "attachment; filename=\"" + node.getName() + "\"");
+                                       }
+                                       IOUtils.copy(JcrUtils.getFileAsStream(node), resp.getOutputStream());
+                               } else {
+                                       throw new IllegalArgumentException("Unsupported node " + node);
+                               }
+                       }
+               } catch (RepositoryException e1) {
+                       throw new JcrException(e1);
+               } finally {
+                       Jcr.logout(session);
+               }
+       }
+
+       @Override
+       public void init() throws ServletException {
+
+               // TODO improve configuration and provisioning of DocBook XSL
+               xslBase = System.getProperty("argeo.docbook.xsl");
+               if (xslBase == null) {
+                       // We need namespace aware XSL!
+                       // Fedora (sudo dnf install docbook5-style-xsl)
+                       String defaultXslBase = "/usr/share/xml/docbook/stylesheet/docbook-xsl-ns/";
+                       if (!Files.exists(Paths.get(defaultXslBase))) {
+                               defaultXslBase = "/opt/docbook-xsl";
+                               if (!Files.exists(Paths.get(defaultXslBase))) {
+                                       log.error("System property argeo.docbook.xsl is not set and default location " + defaultXslBase
+                                                       + " does not exist.");
+                               }
+                       }
+                       xslBase = defaultXslBase;
+
+               }
+
+               documentBuilderFactory = DocumentBuilderFactory.newInstance();
+               documentBuilderFactory.setXIncludeAware(true);
+               documentBuilderFactory.setNamespaceAware(true);
+
+       }
+
+       protected Templates createDocBookTemplates(String xsl) {
+               try {
+                       if (transformerFactory == null) {
+                               transformerFactory = new BasicTransformerFactory();
+                               // We must explicitly use the non-XSLTC transformer, as XSLTC is not working
+                               // with DocBook stylesheets
+//                             transformerFactory = new TransformerFactoryImpl();
+                       }
+                       Source xslSource = new StreamSource(xsl);
+                       Templates templates = transformerFactory.newTemplates(xslSource);
+                       if (templates == null)
+                               throw new IllegalStateException("Could not instantiate XSL " + xsl);
+                       return templates;
+               } catch (TransformerConfigurationException e) {
+                       throw new IllegalStateException("Cannot instantiate XSL " + xsl, e);
+               }
+
+       }
+
+       protected Templates getDocBoookHtmlTemplates() {
+               if (docBoookHtmlTemplates == null) {
+                       String htmlXsl = xslBase + "/html/docbook.xsl";
+                       docBoookHtmlTemplates = createDocBookTemplates(htmlXsl);
+               }
+               return docBoookHtmlTemplates;
+       }
+
+       protected Templates getDocBoookFoTemplates() {
+               if (docBoookFoTemplates == null) {
+                       String foXsl = xslBase + "/fo/docbook.xsl";
+                       docBoookFoTemplates = createDocBookTemplates(foXsl);
+               }
+               return docBoookFoTemplates;
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+       public void addTheme(CmsTheme theme, Map<String, String> properties) {
+               themes.put(theme.getThemeId(), theme);
+       }
+
+       public void removeTheme(CmsTheme theme, Map<String, String> properties) {
+               themes.remove(theme.getThemeId());
+       }
+
+       public static void main(String[] args) throws Exception {
+               // Step 1: Construct a FopFactory by specifying a reference to the configuration
+               // file
+               // (reuse if you plan to render multiple documents!)
+               FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
+
+               // Step 2: Set up output stream.
+               // Note: Using BufferedOutputStream for performance reasons (helpful with
+               // FileOutputStreams).
+               OutputStream out = new BufferedOutputStream(new FileOutputStream(new File(
+                               System.getProperty("user.home") + "/dev/git/unstable/argeo-qa/doc/platform/argeo-platform-test.pdf")));
+
+               try {
+                       // Step 3: Construct fop with desired output format
+                       Fop fop = fopFactory.newFop("application/pdf", out);
+
+                       // Step 4: Setup JAXP using identity transformer
+                       TransformerFactory fopTransformerFactory = TransformerFactory.newInstance();
+                       Transformer fopTransformer = fopTransformerFactory.newTransformer(); // identity transformer
+
+                       // Step 5: Setup input and output for XSLT transformation
+                       // Setup input stream
+                       Source src = new StreamSource(new File(
+                                       System.getProperty("user.home") + "/dev/git/unstable/argeo-qa/doc/platform/argeo-platform.fo"));
+
+                       // Resulting SAX events (the generated FO) must be piped through to FOP
+                       Result res = new SAXResult(fop.getDefaultHandler());
+
+                       // Step 6: Start XSLT transformation and FOP processing
+                       fopTransformer.transform(src, res);
+
+               } finally {
+                       // Clean-up
+                       out.close();
+               }
+       }
+}
diff --git a/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/FontsServlet.java b/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/FontsServlet.java
new file mode 100644 (file)
index 0000000..3e65d65
--- /dev/null
@@ -0,0 +1,51 @@
+package org.argeo.app.servlet.publish;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.api.cms.ux.CmsTheme;
+
+/** Serves fonts locally. */
+public class FontsServlet extends HttpServlet {
+       private static final long serialVersionUID = 6009572962850708537L;
+       private Map<String, CmsTheme> themes = Collections.synchronizedMap(new HashMap<>());
+
+       @Override
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+               String font = req.getPathInfo();
+               font = font.substring(1, font.length());
+               for (CmsTheme theme : themes.values()) {
+                       for (String fontPath : theme.getFontsPaths()) {
+                               if (fontPath.endsWith(font)) {
+                                       if (font.endsWith(".woff"))
+                                               resp.setContentType("font/woff");
+                                       else if (font.endsWith(".woff2"))
+                                               resp.setContentType("font/woff2");
+                                       try (InputStream in = theme.loadPath(fontPath)) {
+                                               IOUtils.copy(in, resp.getOutputStream());
+                                               return;
+                                       }
+                               }
+                       }
+               }
+               resp.setStatus(404);
+       }
+
+       public void addTheme(CmsTheme theme, Map<String, String> properties) {
+               themes.put(theme.getThemeId(), theme);
+       }
+
+       public void removeTheme(CmsTheme theme, Map<String, String> properties) {
+               themes.remove(theme.getThemeId());
+       }
+
+}
diff --git a/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/FopServlet.java b/org.argeo.app.servlet.publish/src/org/argeo/app/servlet/publish/FopServlet.java
new file mode 100644 (file)
index 0000000..a4e07ba
--- /dev/null
@@ -0,0 +1,237 @@
+package org.argeo.app.servlet.publish;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Objects;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.URIResolver;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.Fop;
+import org.apache.fop.apps.FopFactory;
+import org.apache.fop.apps.FopFactoryBuilder;
+import org.apache.xmlgraphics.io.Resource;
+import org.apache.xmlgraphics.io.ResourceResolver;
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentRepository;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.app.geo.GeoUtils;
+import org.argeo.app.geo.GpxUtils;
+import org.argeo.app.geo.acr.GeoEntityUtils;
+import org.argeo.cms.acr.xml.XmlNormalizer;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.servlet.ServletHttpRequest;
+import org.argeo.cms.util.LangUtils;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.Polygon;
+
+import net.sf.saxon.BasicTransformerFactory;
+
+/**
+ * A servlet transforming an XML view of the data to either FOP or PDF.
+ */
+public class FopServlet extends HttpServlet {
+       private static final long serialVersionUID = 6906020513498289335L;
+
+       private final static String PROP_ARGEO_FO_XSL = "argeo.fo.xsl";
+
+       private ContentRepository contentRepository;
+
+       private DocumentBuilderFactory documentBuilderFactory;
+       private TransformerFactory transformerFactory;
+       private Templates foTemplates;
+
+       private URL xslUrl;
+
+       @Override
+       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+               String servletPath = req.getServletPath();
+               String ext = servletPath.substring(servletPath.lastIndexOf('.'));
+               servletPath = servletPath.substring(1, servletPath.lastIndexOf('.'));
+               servletPath = servletPath.substring(servletPath.indexOf('/'), servletPath.length());
+               String path = URLDecoder.decode(servletPath, StandardCharsets.UTF_8);
+
+               boolean pdf = ".pdf".equals(ext);
+               ContentSession session = RemoteAuthUtils.doAs(() -> contentRepository.get(), new ServletHttpRequest(req));
+               Content content = session.get(path);
+
+               // dev only
+               final boolean DEV = false;
+               if (DEV) {
+                       try (InputStream in = xslUrl.openStream()) {
+                               Source xslSource = new StreamSource(in);
+                               foTemplates = transformerFactory.newTemplates(xslSource);
+                               if (foTemplates == null)
+                                       throw new IllegalStateException("Could not instantiate XSL " + xslUrl);
+                       } catch (TransformerConfigurationException | IOException e) {
+                               throw new IllegalStateException("Cannot instantiate XSL " + xslUrl, e);
+                       }
+
+                       Source xmlInput = content.adapt(Source.class);
+                       XmlNormalizer.print(xmlInput, 0);
+               }
+
+               Source xmlInput = content.adapt(Source.class);
+               String systemId = req.getRequestURL().toString();
+               xmlInput.setSystemId(systemId);
+
+               URIResolver uriResolver = (href, base) -> {
+                       try {
+                               URI url = URI.create(href);
+                               if (url.getScheme() != null) {
+                                       if (url.getScheme().equals("file")) {
+                                               InputStream in = Files.newInputStream(Paths.get(URI.create(url.toString())));
+                                               return new StreamSource(in);
+                                       }
+                                       if (url.getScheme().equals("geo2svg")) {
+                                               int lastDot = url.getPath().lastIndexOf('.');
+                                               Polygon polygon;
+                                               if (lastDot > 0) {
+                                                       String includePath = path + url.getPath();
+                                                       Content geoContent = session.get(includePath);
+                                                       String geoExt = includePath.substring(lastDot);
+                                                       if (".gpx".equals(geoExt)) {
+                                                               try (InputStream in = geoContent.open(InputStream.class)) {
+                                                                       polygon = GpxUtils.parseGpxTrackTo(in, Polygon.class);
+                                                               }
+                                                       } else {
+                                                               throw new UnsupportedOperationException(geoExt + " is not supported");
+                                                       }
+                                               } else {
+                                                       Content geoContent;
+                                                       String attrName;
+                                                       if (url.getPath().startsWith("/@")) {
+                                                               geoContent = content;
+                                                               attrName = url.getPath().substring(2);// remove /@
+                                                       } else {
+                                                               throw new IllegalArgumentException("Only direct attributes are currently supported");
+                                                       }
+                                                       polygon = GeoEntityUtils.getGeometry(geoContent, NamespaceUtils.parsePrefixedName(attrName),
+                                                                       Polygon.class);
+                                               }
+                                               try (StringWriter writer = new StringWriter()) {
+                                                       GeoUtils.exportToSvg(new Geometry[] { polygon }, writer, 100, 100);
+                                                       StreamSource res = new StreamSource(new StringReader(writer.toString()));
+                                                       return res;
+                                               }
+                                       }
+                               }
+                       } catch (IOException e) {
+                               throw new RuntimeException("Cannot process " + href);
+                       }
+
+                       String p = href.startsWith("/") ? href : path + '/' + href;
+                       p = URLDecoder.decode(p, StandardCharsets.UTF_8);
+                       Content subContent = session.get(p);
+                       return subContent.adapt(Source.class);
+               };
+
+               ResourceResolver resourceResolver = new ResourceResolver() {
+
+                       @Override
+                       public Resource getResource(URI uri) throws IOException {
+                               String subPath = uri.getPath();
+                               Content subContent = session.get(subPath);
+                               InputStream in = subContent.open(InputStream.class);
+                               return new Resource(in);
+                       }
+
+                       @Override
+                       public OutputStream getOutputStream(URI uri) throws IOException {
+                               return null;
+                       }
+               };
+
+               try {
+                       if (pdf) {
+                               FopFactoryBuilder builder = new FopFactoryBuilder(URI.create(req.getRequestURL().toString()),
+                                               resourceResolver);
+                               FopFactory fopFactory = builder.build();
+//                             FopFactory fopFactory = FopFactory.newInstance(URI.create(req.getRequestURL().toString()));
+                               resp.setContentType("application/pdf");
+                               Fop fop = fopFactory.newFop("application/pdf", resp.getOutputStream());
+                               Transformer transformer = foTemplates.newTransformer();
+                               transformer.setURIResolver(uriResolver);
+                               Result fopResult = new SAXResult(fop.getDefaultHandler());
+                               transformer.transform(xmlInput, fopResult);
+
+                       } else {
+                               Result xmlOutput = new StreamResult(resp.getOutputStream());
+                               resp.setContentType("application/xml");
+                               Transformer transformer = foTemplates.newTransformer();
+//                             transformer = transformerFactory.newTransformer();// identity
+                               transformer.setURIResolver(uriResolver);
+                               transformer.transform(xmlInput, xmlOutput);
+                       }
+               } catch (FOPException | IOException | TransformerException e) {
+                       throw new RuntimeException("Cannot process " + path, e);
+               }
+
+       }
+
+       @Override
+       public void init() throws ServletException {
+//             for (Enumeration<String> it = getServletConfig().getInitParameterNames(); it.hasMoreElements();)
+//                     System.out.println(it.nextElement());
+//             for (String str : getServletContext().getResourcePaths("/"))
+//                     System.out.println(str);
+       }
+
+       public void start(Map<String, Object> properties) {
+               documentBuilderFactory = DocumentBuilderFactory.newInstance();
+               documentBuilderFactory.setXIncludeAware(true);
+               documentBuilderFactory.setNamespaceAware(true);
+
+               transformerFactory = new BasicTransformerFactory();
+//             transformerFactory = TransformerFactory.newDefaultInstance();
+               try {
+                       String xslStr = LangUtils.get(properties, PROP_ARGEO_FO_XSL);
+                       Objects.requireNonNull(xslStr);
+                       xslUrl = new URL(xslStr);
+                       try (InputStream in = xslUrl.openStream()) {
+                               Source xslSource = new StreamSource(in);
+                               foTemplates = transformerFactory.newTemplates(xslSource);
+                               if (foTemplates == null)
+                                       throw new IllegalStateException("Could not instantiate XSL " + xslUrl);
+                       }
+
+               } catch (TransformerConfigurationException | IOException e) {
+                       throw new IllegalStateException("Cannot instantiate XSL " + xslUrl, e);
+               }
+       }
+
+       public void stop(Map<String, Object> properties) {
+
+       }
+
+       public void setContentRepository(ContentRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+
+}
diff --git a/org.argeo.app.theme.default/.classpath b/org.argeo.app.theme.default/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.app.theme.default/.gitignore b/org.argeo.app.theme.default/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/org.argeo.app.theme.default/.project b/org.argeo.app.theme.default/.project
new file mode 100644 (file)
index 0000000..1a71c08
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.theme.default</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.app.theme.default/META-INF/.gitignore b/org.argeo.app.theme.default/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml b/org.argeo.app.theme.default/OSGI-INF/cmsTheme.xml
new file mode 100644 (file)
index 0000000..28ef00f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Argeo Suite Default Theme">
+   <implementation class="org.argeo.app.swt.osgi.BundleSvgTheme"/>
+   <service>
+      <provide interface="org.argeo.api.cms.ux.CmsTheme"/>
+   </service>
+   <property name="themeId" type="String" value="org.argeo.app.theme.default"/>
+   <property name="smallIconSize" type="String" value="24"/>
+</scr:component>
diff --git a/org.argeo.app.theme.default/bnd.bnd b/org.argeo.app.theme.default/bnd.bnd
new file mode 100644 (file)
index 0000000..48ad7e2
--- /dev/null
@@ -0,0 +1,11 @@
+Service-Component:\
+OSGI-INF/cmsTheme.xml
+
+Private-Package: *
+
+Export-Package: !*
+
+Import-Package:\
+org.argeo.app.swt.osgi;resolution:="optional",\
+javax.servlet.*;version="[3,5)",\
+*
\ No newline at end of file
diff --git a/org.argeo.app.theme.default/build.properties b/org.argeo.app.theme.default/build.properties
new file mode 100644 (file)
index 0000000..7f8c707
--- /dev/null
@@ -0,0 +1,2 @@
+bin.includes = META-INF/,\
+               OSGI-INF/
diff --git a/org.argeo.app.theme.default/icons/types/.gitignore b/org.argeo.app.theme.default/icons/types/.gitignore
new file mode 100644 (file)
index 0000000..098a566
--- /dev/null
@@ -0,0 +1,2 @@
+!svg/
+**/*.png
diff --git a/org.argeo.app.theme.default/icons/types/svg/activity.svg b/org.argeo.app.theme.default/icons/types/svg/activity.svg
new file mode 100644 (file)
index 0000000..1fbbc20
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" version="1.1" viewBox="0 0 500 500">
+  <metadata id="metadata13">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <dc:title>activity</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs id="defs4">
+    <style id="style2">.cls-1{fill:none;stroke:#305d74;stroke-linecap:round;stroke-miterlimit:10;stroke-width:40px;}</style>
+  </defs>
+  <title id="title6">activity</title>
+  <path d="m 39,321 c 28,0 56,0 84,0 22,-69.33333 44,-138.66667 66,-208 28,98.66667 56,197.33333 84,296 15.33333,-51.33333 30.66667,-102.66667 46,-154 47.33333,0 94.66667,0 142,0" id="polyline8" style="fill:none;stroke:#305d74;stroke-width:40px;stroke-linecap:round;stroke-miterlimit:10"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/add.svg b/org.argeo.app.theme.default/icons/types/svg/add.svg
new file mode 100644 (file)
index 0000000..bbc6670
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;stroke-width:125px;}.cls-1{stroke:#006838;}.cls-2{stroke:#00a551;}</style>
+  </defs>
+  <title>add</title>
+  <line class="cls-1" x1="264.81" x2="264.81" y1="44.56" y2="444.62"/>
+  <line class="cls-1" x1="464.84" x2="64.78" y1="244.59" y2="244.59"/>
+  <line class="cls-2" x1="253.03" x2="253.03" y1="33.68" y2="433.74"/>
+  <line class="cls-2" x1="453.06" x2="53" y1="233.71" y2="233.71"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/addressBook.svg b/org.argeo.app.theme.default/icons/types/svg/addressBook.svg
new file mode 100644 (file)
index 0000000..f8564d6
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><defs><style>.cls-1{fill:#f3964d;}.cls-2{fill:#fff;}</style></defs><title>addressBook</title><path class="cls-1" d="M320.79,127.44a4.52,4.52,0,0,0-3.31-4.32L93.09,33.23H85.27c-5.8,0-7.82-.37-7.82,4.42V389c0,9.11,6.07,17.11,14.26,19.23L313,488.55h7.82Z"/><path class="cls-1" d="M344.47,116.76v334h50.75a22.13,22.13,0,0,0,22.1-22.1V228.31l.13-192.55a22.12,22.12,0,0,0-22.1-22.1H113.49L329.77,96.84A20.79,20.79,0,0,1,344.47,116.76Z"/><path class="cls-2" d="M220.47,279.62,215.4,260c17.56-3.41,29.08-24.9,27.41-56.25-2.15-40.55-25.42-81.87-52-92.29s-46.35,14-44.19,54.54c1.67,31.51,16.15,63.3,35,80.88l-2.49,15.87c-33.15-1.69-51.73,30.67-57.56,79.54-3.28,27.46,157.66,101.31,149.66,59.15C261.42,349.81,254.67,305.51,220.47,279.62Z"/></svg>
\ No newline at end of file
diff --git a/org.argeo.app.theme.default/icons/types/svg/ascending.svg b/org.argeo.app.theme.default/icons/types/svg/ascending.svg
new file mode 100644 (file)
index 0000000..d1a171c
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#f3964d;stroke-linecap:round;stroke-linejoin:round;stroke-width:20px;}.cls-2{fill:#f3964d;}</style>
+  </defs>
+  <title>ascending</title>
+  <g id="Plus">
+    <line class="cls-1" x1="119" x2="119" y1="128.38" y2="384.84"/>
+    <polygon class="cls-2" points="81.1 139.47 119 73.84 156.9 139.47 81.1 139.47"/>
+    <line class="cls-1" x1="188" x2="406" y1="376.84" y2="376.84"/>
+    <line class="cls-1" x1="188" x2="370" y1="316.84" y2="316.84"/>
+    <line class="cls-1" x1="188" x2="318" y1="250.84" y2="250.84"/>
+    <line class="cls-1" x1="188" x2="270" y1="184.84" y2="184.84"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/calendar.svg b/org.argeo.app.theme.default/icons/types/svg/calendar.svg
new file mode 100644 (file)
index 0000000..60e0ee5
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#454545;}.cls-2,.cls-4{fill:none;stroke:#454545;stroke-miterlimit:10;stroke-width:20px;}.cls-3{fill:#fff;}.cls-4{stroke-linecap:round;}</style>
+  </defs>
+  <title>calendar</title>
+  <g id="Plus">
+    <rect class="cls-1" height="124" rx="12" ry="12" width="400" x="43.48" y="56.17"/>
+    <rect class="cls-2" height="391" rx="12" ry="12" width="391" x="48.98" y="54.67"/>
+    <rect class="cls-1" height="79" rx="12" ry="12" width="79" x="96.48" y="217.17"/>
+    <rect class="cls-1" height="79" rx="12" ry="12" width="79" x="206.48" y="217.17"/>
+    <rect class="cls-1" height="79" rx="12" ry="12" width="79" x="316.48" y="217.17"/>
+    <rect class="cls-1" height="79" rx="12" ry="12" width="79" x="96.48" y="327.17"/>
+    <rect class="cls-1" height="79" rx="12" ry="12" width="79" x="206.48" y="327.17"/>
+    <rect class="cls-1" height="79" rx="12" ry="12" width="79" x="316.48" y="327.17"/>
+    <circle class="cls-3" cx="135.98" cy="88.67" r="26.5"/>
+    <line class="cls-4" x1="135.48" x2="135.48" y1="14.17" y2="89.17"/>
+    <circle class="cls-3" cx="360.98" cy="88.67" r="26.5"/>
+    <line class="cls-4" x1="360.48" x2="360.48" y1="14.17" y2="89.17"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/close.svg b/org.argeo.app.theme.default/icons/types/svg/close.svg
new file mode 100644 (file)
index 0000000..242c922
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;stroke-width:96px;}.cls-1{stroke:#808184;}.cls-2{stroke:#58595b;}</style>
+  </defs>
+  <title>close</title>
+  <line class="cls-1" x1="91.83" x2="429.22" y1="85.31" y2="422.71"/>
+  <line class="cls-1" x1="429.22" x2="91.83" y1="85.31" y2="422.71"/>
+  <line class="cls-2" x1="72.72" x2="410.11" y1="86.08" y2="423.47"/>
+  <line class="cls-2" x1="410.11" x2="72.72" y1="86.08" y2="423.47"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/closeAll.svg b/org.argeo.app.theme.default/icons/types/svg/closeAll.svg
new file mode 100644 (file)
index 0000000..775f7a7
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-2{fill:none;stroke-miterlimit:10;stroke-width:96px;}.cls-1{stroke:#58595b;}.cls-2{stroke:#ddd;}</style>
+  </defs>
+  <title>closeAll</title>
+  <line class="cls-1" x1="58.17" x2="375.94" y1="82.07" y2="399.84"/>
+  <line class="cls-1" x1="375.94" x2="58.17" y1="82.07" y2="399.84"/>
+  <line class="cls-2" x1="93.17" x2="410.94" y1="81.07" y2="398.84"/>
+  <line class="cls-2" x1="410.94" x2="93.17" y1="81.07" y2="398.84"/>
+  <line class="cls-1" x1="127.17" x2="444.94" y1="81.07" y2="398.84"/>
+  <line class="cls-1" x1="444.94" x2="127.17" y1="81.07" y2="398.84"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/dashboard.svg b/org.argeo.app.theme.default/icons/types/svg/dashboard.svg
new file mode 100644 (file)
index 0000000..852cd6a
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-2{fill:none;stroke-linecap:round;stroke-miterlimit:10;}.cls-1{stroke:#305d74;stroke-width:35px;}.cls-2{stroke:#f3964d;stroke-width:50px;}.cls-3{fill:#177f95;}.cls-4{fill:#49bac5;}</style>
+  </defs>
+  <title>dashboard</title>
+  <g id="Plus">
+    <polyline class="cls-1" points="379.15 199.72 379.15 456.05 113.88 456.05 113.88 199.72"/>
+    <polyline class="cls-2" points="47.29 255.25 244 58.54 440.72 255.25"/>
+    <rect class="cls-3" height="146.05" width="83.61" x="158.39" y="294"/>
+    <rect class="cls-4" height="76.5" width="64.5" x="266.5" y="217.5"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/delete.svg b/org.argeo.app.theme.default/icons/types/svg/delete.svg
new file mode 100644 (file)
index 0000000..b2800d4
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#454545;}.cls-2{fill:none;stroke:#fff;stroke-linecap:round;stroke-miterlimit:10;stroke-width:50px;}</style>
+  </defs>
+  <title>delete</title>
+  <g id="Plus">
+    <path class="cls-1" d="M368,474.8l-232.79.09c-14.28,0-30.79-21.78-30.79-36.06L80.65,158.69l341-.44-23,279.7C398.61,452.23,382.25,474.8,368,474.8Z"/>
+    <rect class="cls-1" height="52.93" rx="12" ry="12" width="392.28" x="55" y="77.77"/>
+    <rect class="cls-1" height="84.44" rx="19.8" ry="19.8" width="182.09" x="160.99" y="25"/>
+    <line class="cls-2" x1="253.99" x2="253.99" y1="208.67" y2="408.74"/>
+    <line class="cls-2" x1="145.52" x2="162.82" y1="207.99" y2="409.42"/>
+    <line class="cls-2" x1="358.84" x2="340.33" y1="208.12" y2="409.29"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/descending.svg b/org.argeo.app.theme.default/icons/types/svg/descending.svg
new file mode 100644 (file)
index 0000000..4f363b0
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#f3964d;stroke-linecap:round;stroke-linejoin:round;stroke-width:20px;}.cls-2{fill:#f3964d;}</style>
+  </defs>
+  <title>descending</title>
+  <g id="Plus">
+    <line class="cls-1" x1="120" x2="120" y1="355.3" y2="98.84"/>
+    <polygon class="cls-2" points="157.9 344.21 120 409.84 82.1 344.21 157.9 344.21"/>
+    <line class="cls-1" x1="189" x2="407" y1="311.84" y2="311.84"/>
+    <line class="cls-1" x1="189" x2="371" y1="251.84" y2="251.84"/>
+    <line class="cls-1" x1="189" x2="319" y1="185.84" y2="185.84"/>
+    <line class="cls-1" x1="189" x2="271" y1="119.84" y2="119.84"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/document.svg b/org.argeo.app.theme.default/icons/types/svg/document.svg
new file mode 100644 (file)
index 0000000..5265430
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#305d74;stroke:#305d74;}.cls-1,.cls-3{stroke-miterlimit:10;}.cls-2{fill:#fff;}.cls-3{fill:none;stroke:#fff;stroke-linecap:round;stroke-width:50px;}</style>
+  </defs>
+  <title>document</title>
+  <polygon class="cls-1" points="393.14 463.84 78.14 463.84 78.14 49 300.02 49 393.14 163.4 393.14 463.84"/>
+  <polygon class="cls-2" points="375.05 179.8 294.69 179.8 294.69 81.2 375.05 179.8"/>
+  <line class="cls-3" x1="127.68" x2="334.87" y1="270.73" y2="270.73"/>
+  <line class="cls-3" x1="127.68" x2="334.87" y1="391.27" y2="391.27"/>
+  <line class="cls-3" x1="132.18" x2="189.19" y1="157.12" y2="157.12"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/documents.svg b/org.argeo.app.theme.default/icons/types/svg/documents.svg
new file mode 100644 (file)
index 0000000..8e7684f
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-5{fill:#305d74;}.cls-1,.cls-4,.cls-5{stroke:#305d74;}.cls-1,.cls-3,.cls-4,.cls-5{stroke-miterlimit:10;}.cls-2{fill:#fff;}.cls-3{fill:none;stroke:#fff;stroke-linecap:round;stroke-width:50px;}.cls-4{fill:#292561;}.cls-4,.cls-5{stroke-width:30px;}</style>
+  </defs>
+  <title>documents</title>
+  <polygon class="cls-1" points="437.14 465.84 122.14 465.84 122.14 51 344.02 51 437.14 165.4 437.14 465.84"/>
+  <polygon class="cls-2" points="419.05 181.8 338.69 181.8 338.69 83.2 419.05 181.8"/>
+  <line class="cls-3" x1="171.68" x2="378.87" y1="272.73" y2="272.73"/>
+  <line class="cls-3" x1="171.68" x2="378.87" y1="393.27" y2="393.27"/>
+  <line class="cls-3" x1="176.18" x2="233.19" y1="159.12" y2="159.12"/>
+  <line class="cls-4" x1="287" x2="51" y1="6" y2="6"/>
+  <line class="cls-5" x1="66" x2="66" y1="1" y2="389"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/email.svg b/org.argeo.app.theme.default/icons/types/svg/email.svg
new file mode 100644 (file)
index 0000000..444445b
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#fff;stroke:#454545;stroke-linejoin:round;stroke-width:45px;}</style>
+  </defs>
+  <title>email</title>
+  <rect class="cls-1" height="295.92" width="372.28" x="61.82" y="88.28"/>
+  <polygon class="cls-1" points="65.48 88.28 430.03 88.29 247.76 305.77 65.48 88.28"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/fav.svg b/org.argeo.app.theme.default/icons/types/svg/fav.svg
new file mode 100644 (file)
index 0000000..b78263c
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#ffe78b;stroke:#dcc068;stroke-miterlimit:10;stroke-width:5px;}</style>
+  </defs>
+  <title>fav</title>
+  <polygon class="cls-1" points="392.45 451.67 251 360.47 110.47 450.74 152.35 290.67 23.93 183.65 190.51 175.28 251.93 18 308.7 171.55 479 183.65 350.57 289.74 392.45 451.67"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/favNot.svg b/org.argeo.app.theme.default/icons/types/svg/favNot.svg
new file mode 100644 (file)
index 0000000..2902279
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#ccc;}</style>
+  </defs>
+  <title>favNot</title>
+  <polygon class="cls-1" points="388.45 464.67 247 373.47 106.47 463.74 148.35 303.67 19.93 196.65 186.51 188.28 247.93 31 304.7 184.55 475 196.65 346.57 302.74 388.45 464.67"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/folder.svg b/org.argeo.app.theme.default/icons/types/svg/folder.svg
new file mode 100644 (file)
index 0000000..3874e6f
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#177f95;}</style>
+  </defs>
+  <title>folder</title>
+  <path class="cls-1" d="M133.63,215.59a4.17,4.17,0,0,0-4,3L46.92,425.18v7.19c0,5.34-.34,7.2,4.06,7.2h323.4c8.38,0,15.75-5.59,17.69-13.12L466,222.79v-7.2Z"/>
+  <path class="cls-1" d="M123.8,193.8H431.21V147.09a20.36,20.36,0,0,0-20.34-20.34H226.48L189.2,74.63h-140A20.36,20.36,0,0,0,28.9,95V406.4l76.57-199.06A19.13,19.13,0,0,1,123.8,193.8Z"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/group.svg b/org.argeo.app.theme.default/icons/types/svg/group.svg
new file mode 100644 (file)
index 0000000..4a1ee49
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#177f95;}.cls-2,.cls-3{fill:#fff;}.cls-3{stroke:#177f95;stroke-miterlimit:10;stroke-width:9px;}</style>
+  </defs>
+  <title>group</title>
+  <circle class="cls-1" cx="246" cy="245" r="236"/>
+  <path class="cls-2" d="M347.33,221.71l-4.18-15c18.42-8.76,31.56-30.88,31.56-57,0-33.76-21.89-61.12-48.89-61.12S276.93,116,276.93,149.76c0,26.23,13.28,48.42,31.85,57.08l-3.46,14.33C271,230.8,249.92,264.5,241.17,308c-4.91,24.44,175.23,33.18,169.25,0C403.09,267.37,381.42,232.31,347.33,221.71Z"/>
+  <path class="cls-2" d="M197.08,231.41l-4.18-15c18.42-8.77,31.56-30.88,31.56-57,0-33.75-21.89-61.11-48.89-61.11s-48.89,27.36-48.89,61.11c0,26.24,13.28,48.43,31.85,57.09l-3.46,14.33c-34.33,9.63-55.4,43.33-64.15,86.83-4.91,24.44,175.23,33.18,169.25,0C252.84,277.07,231.17,242,197.08,231.41Z"/>
+  <path class="cls-3" d="M273.45,272.94l-5.06-18.09c22.25-10.59,38.13-37.3,38.13-68.82,0-40.77-26.44-73.82-59.06-73.82S188.41,145.26,188.41,186c0,31.69,16.05,58.49,38.48,69l-4.19,17.3c-41.46,11.63-66.91,52.34-77.48,104.88-5.93,29.51,211.65,40.07,204.42,0C340.79,328.09,314.61,285.74,273.45,272.94Z"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/historyAscending.svg b/org.argeo.app.theme.default/icons/types/svg/historyAscending.svg
new file mode 100644 (file)
index 0000000..975310e
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#f3964d;stroke-linecap:round;stroke-linejoin:round;stroke-width:25px;}.cls-2{fill:#f3964d;}</style>
+  </defs>
+  <title>historyAscending</title>
+  <path class="cls-1" d="M402.44,198.19A172,172,0,1,0,374.8,354.52"/>
+  <polygon class="cls-2" points="428.83 168.54 399.33 187.75 365.02 179.84 410.33 249.82 428.83 168.54"/>
+  <line class="cls-1" x1="233.33" x2="233.33" y1="136.82" y2="269.82"/>
+  <line class="cls-1" x1="233.33" x2="321.33" y1="269.82" y2="269.82"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/historyDescending.svg b/org.argeo.app.theme.default/icons/types/svg/historyDescending.svg
new file mode 100644 (file)
index 0000000..7c35988
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#f3964d;stroke-linecap:round;stroke-linejoin:round;stroke-width:25px;}.cls-2{fill:#f3964d;}</style>
+  </defs>
+  <title>historyDescending</title>
+  <path class="cls-1" d="M86.21,197.19a172,172,0,1,1,27.64,156.33"/>
+  <polygon class="cls-2" points="123.63 178.84 89.32 186.75 59.82 167.54 78.33 248.82 123.63 178.84"/>
+  <line class="cls-1" x1="245.33" x2="245.33" y1="135.82" y2="268.82"/>
+  <line class="cls-1" x1="245.33" x2="333.33" y1="268.82" y2="268.82"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/home.svg b/org.argeo.app.theme.default/icons/types/svg/home.svg
new file mode 100644 (file)
index 0000000..0c2ba6f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#fff;}.cls-1,.cls-2,.cls-3{stroke:#454545;}.cls-1,.cls-2{stroke-linejoin:round;stroke-width:50px;}.cls-2{fill:none;}.cls-3{fill:#454545;stroke-miterlimit:10;}</style>
+  </defs>
+  <title>home</title>
+  <rect class="cls-1" height="246.82" width="246.82" x="128.47" y="216.77"/>
+  <polygon class="cls-2" points="65.47 216.77 251.88 30.36 438.29 216.77 65.47 216.77"/>
+  <rect class="cls-3" height="97.13" width="66.94" x="184.94" y="342.18"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/inbox.svg b/org.argeo.app.theme.default/icons/types/svg/inbox.svg
new file mode 100644 (file)
index 0000000..1acd8dd
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#f3964d;stroke-linecap:round;stroke-linejoin:round;stroke-width:33px;}.cls-2{fill:#f3964d;}</style>
+  </defs>
+  <title>inbox</title>
+  <g id="Plus">
+    <line class="cls-1" x1="253.73" x2="253.73" y1="231.53" y2="69.07"/>
+    <polygon class="cls-2" points="303.1 217.08 253.73 302.57 204.37 217.08 303.1 217.08"/>
+    <line class="cls-1" x1="114.73" x2="114.73" y1="226.82" y2="404.82"/>
+    <line class="cls-1" x1="392.73" x2="392.73" y1="404.82" y2="226.82"/>
+    <line class="cls-1" x1="114.73" x2="392.73" y1="404.82" y2="404.82"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/license.svg b/org.argeo.app.theme.default/icons/types/svg/license.svg
new file mode 100644 (file)
index 0000000..994e2ec
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;}.cls-1,.cls-2{stroke:#454545;stroke-miterlimit:10;stroke-width:30px;}.cls-2{fill:#f3964d;}</style>
+  </defs>
+  <title>license</title>
+  <rect class="cls-1" height="276.25" width="404.67" x="42.67" y="78.19"/>
+  <circle class="cls-2" cx="319.33" cy="217" r="79.67"/>
+  <polyline class="cls-2" points="362.63 274 362.63 452.69 318.61 407.19 276.28 452.69 276.28 274"/>
+  <line class="cls-1" x1="80.67" x2="196.31" y1="271" y2="271"/>
+  <line class="cls-1" x1="88.67" x2="186.67" y1="178" y2="178"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/location.svg b/org.argeo.app.theme.default/icons/types/svg/location.svg
new file mode 100644 (file)
index 0000000..6bf408b
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#305d74;}.cls-2{fill:#6ac59a;}.cls-3{fill:#f3964d;}.cls-4{fill:none;stroke:#fff;stroke-miterlimit:10;stroke-width:17px;}</style>
+  </defs>
+  <title>location</title>
+  <g id="Plus">
+    <polygon class="cls-1" points="432.15 447.73 71.15 447.73 94.15 313.73 393.15 284.73 432.15 447.73"/>
+    <polygon class="cls-2" points="303.87 404.93 175.17 419.23 142.67 343.83 246.67 315.23 303.87 404.93"/>
+    <path class="cls-3" d="M272.37,239.47c-3.18-11.88-24.67-17.25-54.1-15.44L190,118.58c13.37-8.43,20.78-17.4,18.84-24.64-3.66-13.64-148.6,25.2-144.94,38.84,1.94,7.24,12.84,11.3,28.63,11.91l28.25,105.46c-26.39,13.14-42.31,28.54-39.13,40.42,2.25,8.39,45.11,1.69,89.64-9.66l20.26,75.6,14.68,13.85,5.09-19.15L191.07,275.6C234.85,263.21,274.6,247.78,272.37,239.47Z"/>
+    <line class="cls-4" x1="171.65" x2="195.65" y1="137.65" y2="223.65"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/logout.svg b/org.argeo.app.theme.default/icons/types/svg/logout.svg
new file mode 100644 (file)
index 0000000..606f172
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#454545;stroke-linecap:round;stroke-miterlimit:10;stroke-width:50px;}</style>
+  </defs>
+  <title>logout</title>
+  <path class="cls-1" d="M336.7,100.05a169.92,169.92,0,1,1-186.22,6"/>
+  <line class="cls-1" x1="248.59" x2="248.59" y1="233.73" y2="64.93"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/map.svg b/org.argeo.app.theme.default/icons/types/svg/map.svg
new file mode 100644 (file)
index 0000000..0f68569
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><defs><style>.cls-1{fill:#49bac5;}.cls-2{fill:#35987a;}.cls-3{fill:#6ac59a;}.cls-4{fill:none;stroke:#4d4d4d;stroke-linecap:round;stroke-linejoin:round;stroke-width:20px;}</style></defs><title>map</title><g id="Plus"><ellipse class="cls-1" cx="248.73" cy="250.99" rx="218.51" ry="221.63"/><path class="cls-2" d="M87.76,197.09c4.12-1.21,8.32-2.6,12.59-2.18,5.07.51,9.52,3.52,13.73,6.43a23.81,23.81,0,0,1,6,5.28c2.12,2.93,2.79,6.66,3.36,10.25a428.24,428.24,0,0,1,5.07,82.89c-.32,9.11-.63,19.23,5.22,26.16,2.95,3.52,7.12,5.7,11.17,7.8l12.33,6.37c2.91,1.5,6,3.23,7.32,6.26.92,2.17.73,4.63.53,7-1.22,14.44-1.85,30.71,7.73,41.48,4.23,4.76,10,7.82,14.72,12.1,2.18,2,4.14,4.22,6.62,5.78a36.12,36.12,0,0,0,7.47,3.14c17.43,6.15,32.22,18,46.65,29.7,2.23,1.81,4.52,3.68,5.9,6.22,3.1,5.73.7,12.84,1.37,19.34A66,66,0,0,1,214.13,473c-12.87-3.66-24.5-11.2-37.55-14.16-7.4-1.67-15.05-1.82-22.53-3.11a79.31,79.31,0,0,1-42-22,170.17,170.17,0,0,1-12.41-14.38C94.84,413.29,90,407.22,85.31,401A395.71,395.71,0,0,1,49,342.78c-2.58-5.06-5-10.18-7.13-15.47a122.74,122.74,0,0,1-7.32-28.11c-1.79-12.75-1.7-25.78-4.5-38.34-2.18-9.77-6.1-19.19-6.88-29.17s2.45-21.24,11.09-26.08c1.58-.89-.11-4.77-.86-5.66,3.92,6.41,16.77,3.46,23,3A156.19,156.19,0,0,0,87.76,197.09Z"/><path class="cls-3" d="M338.09,83.07c-6.44,2.17-13.26,2.82-19.95,4-36.86,6.43-70.48,30-89.45,62.68-4.23,7.3-7.18,18-.55,23.13,2.74,2.13,6.39,2.53,9.83,2.86l33.44,3.16c9.5.9,20.34,2.57,25.5,10.71s2,19.14-4.2,26.26-15,11.32-23.17,16-16.4,10.51-20.18,19.23c-1.89,4.36-2.53,9.16-2.94,13.9a158.24,158.24,0,0,0,.53,32.2c1,8.31,3,17.14,9.08,22.77,6.79,6.26,16.8,6.91,26,7.23l45.38,1.61c3.37.12,6.87.27,9.87,1.83s5.34,4.58,7.83,7.1c9.69,9.8,24.07,13.33,34.43,22.4,8.75,7.65,14.62,19.2,25.35,23.53,9.56,3.86,20.45.84,29.8-3.51,1.24-4.58,5.39-7.59,8.73-10.92,10.68-10.6,14.28-26.33,17.41-41.15,9.93-47,19.84-96.16,7.94-142.74-3.24-12.68-8-24.89-13.21-36.89-3.28-7.58-7.11-15.58-14.2-19.7-2.7-1.57-5.84-2.56-7.9-4.93a19.25,19.25,0,0,1-2.83-5.34c-6.68-16.07-18.64-29.17-30.38-41.92-4.45-4.83-9-9.77-14.81-12.83-7.25-3.85-19.16-5.91-24.58,1.25C354.6,73.22,348.13,79.67,338.09,83.07Z"/><ellipse class="cls-4" cx="252.03" cy="250.32" rx="224.45" ry="227.65"/><path class="cls-4" d="M362.94,52.13c4.84,11.1-11.83,27-23.19,30.86s-23.77,2.3-35.54,4.5c-25.72,4.8-44.75,26.22-61.73,46.38-10.17,12.09-21,27.85-15,42.51l52,3.31c3.93.25,8.05.56,11.37,2.7,5.86,3.78,7.2,11.72,7.94,18.72,1.26,12.09-15.08,19.75-50.73,45.2-8.5,18.63,3.44,38.62,2,59.11-.28,4.15-.35,8.57,1.71,12.18s6,5.78,9.84,7.22c29.79,11.07,70.08-8.08,91.22,15.91,4.63,5.24,7.4,11.87,11.43,17.6,12.85,18.33,50,34.48,69.92,24.57"/><path class="cls-4" d="M36.73,203.2a253.06,253.06,0,0,1,72.74-8.73c5.6.15,12,.86,15.34,5.4,2,2.7,2.52,6.22,2.92,9.58a336.22,336.22,0,0,1,.46,74.3c-2.07,19.69-3,45.11,14.87,53.18,6.66,3,15,2.75,20.22,7.87,8.8,8.57,2.1,23.31,2.42,35.68.62,23.79,27.1,36.5,49.11,44.72s47.85,24,44.77,47.62"/></g></svg>
\ No newline at end of file
diff --git a/org.argeo.app.theme.default/icons/types/svg/milestone.svg b/org.argeo.app.theme.default/icons/types/svg/milestone.svg
new file mode 100644 (file)
index 0000000..b99b69d
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#49bac5;}.cls-2{fill:none;stroke:#fff;stroke-linecap:round;stroke-linejoin:round;stroke-width:40px;}</style>
+  </defs>
+  <title>milestone</title>
+  <rect class="cls-1" height="337.48" rx="11" ry="11" width="337.48" x="81" y="83.52"/>
+  <path class="cls-1" d="M407.48,94.52V410H92V94.52H407.48m0-22H92a22,22,0,0,0-22,22V410a22,22,0,0,0,22,22H407.48a22,22,0,0,0,22-22V94.52a22,22,0,0,0-22-22Z"/>
+  <polyline class="cls-2" points="156.1 285.83 239.74 343.74 341.07 158.77"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/mobile.svg b/org.argeo.app.theme.default/icons/types/svg/mobile.svg
new file mode 100644 (file)
index 0000000..c991bec
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-3{fill:#fff;}.cls-1,.cls-2,.cls-3{stroke:#454545;}.cls-1,.cls-2{stroke-linejoin:round;}.cls-1{stroke-width:50px;}.cls-2{fill:none;stroke-width:92px;}.cls-3{stroke-miterlimit:10;}</style>
+  </defs>
+  <title>mobile</title>
+  <rect class="cls-1" height="286.94" transform="translate(493.25 -3.51) rotate(90)" width="430.9" x="32.93" y="101.39"/>
+  <line class="cls-2" x1="115.45" x2="391.85" y1="400.47" y2="400.47"/>
+  <circle class="cls-3" cx="249.01" cy="414.91" r="29"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/note.svg b/org.argeo.app.theme.default/icons/types/svg/note.svg
new file mode 100644 (file)
index 0000000..132478f
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#fff;stroke-linecap:round;stroke-width:27px;}.cls-1,.cls-2{stroke:#305d74;stroke-linejoin:round;}.cls-2{fill:#305d74;stroke-width:13px;}</style>
+  </defs>
+  <title>note</title>
+  <polygon class="cls-1" points="415.44 439.47 116.18 439.47 116.18 45.37 326.97 45.37 415.44 154.05 415.44 439.47"/>
+  <polygon class="cls-2" points="380.32 162.67 315.43 162.67 315.43 83.05 380.32 162.67"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/openUserMenu.svg b/org.argeo.app.theme.default/icons/types/svg/openUserMenu.svg
new file mode 100644 (file)
index 0000000..a84bc65
--- /dev/null
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Layer_1"
+   data-name="Layer 1"
+   viewBox="0 0 500 500"
+   version="1.1"
+   sodipodi:docname="openUserMenu.svg"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata35">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Artboard 153</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="2309"
+     inkscape:window-height="1591"
+     id="namedview33"
+     showgrid="false"
+     inkscape:zoom="2.016"
+     inkscape:cx="151.5377"
+     inkscape:cy="249.50397"
+     inkscape:window-x="766"
+     inkscape:window-y="271"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="Layer_1"
+     inkscape:pagecheckerboard="true"
+     inkscape:document-rotation="0" />
+  <defs
+     id="defs4">
+    <style
+       id="style2">.cls-1{fill:#177f95;}.cls-2{fill:#fff;}.cls-3,.cls-4{fill:#305d74;stroke:#305d74;stroke-linecap:round;stroke-miterlimit:10;}.cls-3{stroke-width:11.28px;}.cls-4{stroke-width:30.86px;}</style>
+  </defs>
+  <title
+     id="title6">Artboard 153</title>
+  <rect
+     style="fill:#00294b;stroke-width:6.987;stroke-miterlimit:10;fill-opacity:1"
+     id="rect833"
+     width="579.83307"
+     height="554.9361"
+     x="-32.365406"
+     y="-23.750851" />
+  <polygon
+     class="cls-3"
+     points="389.25,409.19 340.72,360.35 437.77,360.35 "
+     id="polygon28"
+     transform="matrix(1.7950921,0,0,2.8439895,-448.72886,-847.64073)"
+     style="stroke:none;stroke-width:3.09231254;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1;fill:#ffffff;fill-opacity:1" />
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/organisation.svg b/org.argeo.app.theme.default/icons/types/svg/organisation.svg
new file mode 100644 (file)
index 0000000..767dc00
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#305d74;}.cls-2{fill:#fff;}</style>
+  </defs>
+  <title>organisation</title>
+  <rect class="cls-1" height="303.21" width="176.99" x="256.65" y="129"/>
+  <rect class="cls-2" height="54.7" width="54.7" x="343.5" y="173.99"/>
+  <rect class="cls-2" height="54.7" width="54.7" x="343.5" y="259.2"/>
+  <rect class="cls-2" height="54.7" width="54.7" x="343.5" y="346.72"/>
+  <rect class="cls-1" height="393.49" width="266.78" x="50.22" y="63"/>
+  <rect class="cls-2" height="73.01" width="73.01" x="92.5" y="110.99"/>
+  <rect class="cls-2" height="73.01" width="73.01" x="207.14" y="111.03"/>
+  <rect class="cls-2" height="73.01" width="73.01" x="92.14" y="234.03"/>
+  <rect class="cls-2" height="73.01" width="73.01" x="211.12" y="234.02"/>
+  <rect class="cls-2" height="73.01" width="73.01" x="92.14" y="347.03"/>
+  <rect class="cls-2" height="73.01" width="73.01" x="213.14" y="344.03"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/organisationContact.svg b/org.argeo.app.theme.default/icons/types/svg/organisationContact.svg
new file mode 100644 (file)
index 0000000..67c9efd
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><defs><style>.cls-1{fill:#177f95;}.cls-2{fill:#fff;}</style></defs><title>organisationContact</title><circle class="cls-1" cx="246.5" cy="242.5" r="232.5"/><rect class="cls-2" x="270.45" y="132.45" width="138.48" height="237.24"/><rect class="cls-1" x="338.4" y="167.65" width="42.8" height="42.8"/><rect class="cls-1" x="338.4" y="234.32" width="42.8" height="42.8"/><rect class="cls-1" x="338.4" y="302.8" width="42.8" height="42.8"/><rect class="cls-2" x="108.93" y="80.81" width="208.74" height="307.88"/><rect class="cls-1" x="142.01" y="118.36" width="57.12" height="57.12"/><rect class="cls-1" x="231.71" y="118.38" width="57.12" height="57.12"/><rect class="cls-1" x="141.73" y="214.62" width="57.12" height="57.12"/><rect class="cls-1" x="234.82" y="214.62" width="57.12" height="57.12"/><rect class="cls-1" x="141.73" y="303.04" width="57.12" height="57.12"/><rect class="cls-1" x="236.4" y="300.69" width="57.12" height="57.12"/></svg>
\ No newline at end of file
diff --git a/org.argeo.app.theme.default/icons/types/svg/people.svg b/org.argeo.app.theme.default/icons/types/svg/people.svg
new file mode 100644 (file)
index 0000000..e28542f
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#f3964d;}.cls-2,.cls-3{fill:#fff;}.cls-3{stroke:#f3964d;stroke-miterlimit:10;stroke-width:9px;}</style>
+  </defs>
+  <title>people</title>
+  <circle class="cls-1" cx="250.65" cy="245.31" r="236"/>
+  <path class="cls-2" d="M352,222l-4.19-15c18.42-8.77,31.57-30.88,31.57-57,0-33.75-21.89-61.12-48.9-61.12s-48.89,27.37-48.89,61.12c0,26.24,13.29,48.42,31.86,57.09L310,221.48c-34.32,9.63-55.39,43.33-64.15,86.83-4.91,24.44,175.24,33.18,169.25,0C407.74,267.68,386.07,232.62,352,222Z"/>
+  <path class="cls-2" d="M201.74,231.71l-4.19-15c18.42-8.76,31.57-30.87,31.57-57,0-33.75-21.89-61.12-48.9-61.12S131.33,126,131.33,159.76c0,26.23,13.29,48.42,31.86,57.09l-3.47,14.33c-34.32,9.62-55.4,43.33-64.15,86.83-4.91,24.44,175.24,33.18,169.25,0C257.49,277.38,235.82,242.32,201.74,231.71Z"/>
+  <path class="cls-3" d="M278.1,273.24l-5.05-18.09c22.24-10.58,38.12-37.29,38.12-68.81,0-40.77-26.44-73.82-59.05-73.82s-59.06,33.05-59.06,73.82c0,31.68,16.05,58.48,38.48,68.95l-4.18,17.31c-41.46,11.62-66.92,52.33-77.48,104.87-5.94,29.52,211.64,40.08,204.42,0C345.44,328.4,319.27,286.05,278.1,273.24Z"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/person.svg b/org.argeo.app.theme.default/icons/types/svg/person.svg
new file mode 100644 (file)
index 0000000..b29b335
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#f3964d;}.cls-2{fill:#fff;}</style>
+  </defs>
+  <title>person</title>
+  <circle class="cls-1" cx="259" cy="249" r="235"/>
+  <path class="cls-2" d="M285.92,264.66l-5.24-18.73c23-11,39.49-38.63,39.49-71.27,0-42.23-27.39-76.46-61.17-76.46s-61.16,34.23-61.16,76.46c0,32.81,16.62,60.57,39.85,71.41L233.36,264C190.42,276,164.05,318.2,153.11,372.62c-6.15,30.57,219.21,41.51,211.72,0C355.66,321.79,328.55,277.93,285.92,264.66Z"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/project-01.svg b/org.argeo.app.theme.default/icons/types/svg/project-01.svg
new file mode 100644 (file)
index 0000000..c94ba9b
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#fff;}.cls-2{fill:#35987a;}.cls-3,.cls-4,.cls-5,.cls-6{fill:none;}.cls-3,.cls-4{stroke:#35987a;stroke-linecap:round;stroke-width:49px;}.cls-3,.cls-5,.cls-6{stroke-miterlimit:10;}.cls-4{stroke-linejoin:round;}.cls-5,.cls-6{stroke:#000;}.cls-5{stroke-width:51px;}.cls-6{stroke-width:9px;}</style>
+  </defs>
+  <title>project-01</title>
+  <rect class="cls-1" height="382.19" rx="13.5" ry="13.5" width="317" x="67.5" y="56.34"/>
+  <path class="cls-2" d="M371,69.84V425H81V69.84H371m0-27H81a27,27,0,0,0-27,27V425a27,27,0,0,0,27,27H371a27,27,0,0,0,27-27V69.84a27,27,0,0,0-27-27Z"/>
+  <line class="cls-3" x1="132.5" x2="321.5" y1="132" y2="132"/>
+  <line class="cls-4" x1="132.5" x2="308.5" y1="248.5" y2="248.5"/>
+  <line class="cls-5" x1="309.73" x2="480.45" y1="337.71" y2="125.58"/>
+  <polygon class="cls-6" points="287.3 331.2 321.68 358.04 267.58 389.45 287.3 331.2"/>
+  <line class="cls-4" x1="128.5" x2="238.5" y1="360.5" y2="360.5"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/refresh.svg b/org.argeo.app.theme.default/icons/types/svg/refresh.svg
new file mode 100644 (file)
index 0000000..638fd55
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#f58430;stroke-miterlimit:10;stroke-width:64px;}.cls-2{fill:#f58430;}</style>
+  </defs>
+  <title>refresh</title>
+  <path class="cls-1" d="M395,365.3A189.26,189.26,0,0,1,246,437.72c-101.78,0-184.83-80.18-189.42-180.83"/>
+  <polygon class="cls-2" points="299.56 353.88 435.57 248.1 459.2 418.78 299.56 353.88"/>
+  <path class="cls-1" d="M96.88,118.68A189.29,189.29,0,0,1,246,46.26c102,0,185.18,80.53,189.45,181.47"/>
+  <polygon class="cls-2" points="192.34 130.1 56.33 235.88 32.7 65.2 192.34 130.1"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/report.svg b/org.argeo.app.theme.default/icons/types/svg/report.svg
new file mode 100644 (file)
index 0000000..9321310
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><defs><style>.cls-1{fill:#177f95;}.cls-2{fill:#fff;}</style></defs><title>report</title><rect class="cls-1" x="52.5" y="43.18" width="400" height="371.64"/><rect class="cls-2" x="78.09" y="126.75" width="350" height="40"/><rect class="cls-2" x="78.09" y="198.02" width="350" height="40"/><rect class="cls-2" x="78.09" y="267.28" width="350" height="40"/><rect class="cls-2" x="78.09" y="338.55" width="350" height="40"/><rect class="cls-1" x="178.79" y="89.15" width="14.67" height="312.96"/><rect class="cls-1" x="311.49" y="88.17" width="14.67" height="312.96"/></svg>
\ No newline at end of file
diff --git a/org.argeo.app.theme.default/icons/types/svg/save.svg b/org.argeo.app.theme.default/icons/types/svg/save.svg
new file mode 100644 (file)
index 0000000..09660dd
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#454545;}</style>
+  </defs>
+  <title>save</title>
+  <path class="cls-1" d="M21.12,19.33V479H480.77V121.64L370.45,19.33Zm316,143.84H165V48.6H337.08Zm-229.65,86H394.11V450.36H107.43Z"/>
+  <rect class="cls-1" height="57.88" transform="translate(440.03 211.23) rotate(-180)" width="57.88" x="191.08" y="76.68"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/saveAll.svg b/org.argeo.app.theme.default/icons/types/svg/saveAll.svg
new file mode 100644 (file)
index 0000000..3f2ebde
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-2,.cls-3{fill:#454545;}.cls-2,.cls-3{stroke:#4f4d4e;}.cls-2,.cls-3,.cls-4,.cls-5{stroke-miterlimit:10;}.cls-2,.cls-4{stroke-width:30px;}.cls-3,.cls-5{stroke-width:40px;}.cls-4,.cls-5{fill:none;stroke:#7c7c7c;}</style>
+  </defs>
+  <title>saveAll</title>
+  <path class="cls-1" d="M170.19,125.05v338.3H508.48v-263l-81.19-75.31ZM402.73,230.92H276.06V146.6H402.73Zm-169,63.28h211V442.29h-211Z"/>
+  <rect class="cls-1" height="42.6" transform="translate(633.14 377.12) rotate(-180)" width="42.6" x="295.27" y="167.26"/>
+  <line class="cls-2" x1="376.88" x2="88.45" y1="70.98" y2="70.98"/>
+  <line class="cls-3" x1="108.19" x2="108.19" y1="68.98" y2="418.1"/>
+  <line class="cls-4" x1="321.63" x2="11.28" y1="2.33" y2="2.33"/>
+  <line class="cls-5" x1="29.79" x2="29.79" y1="1.33" y2="383.52"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/search.svg b/org.argeo.app.theme.default/icons/types/svg/search.svg
new file mode 100644 (file)
index 0000000..6fa30df
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#231f20;stroke-width:31px;}.cls-1,.cls-2{stroke:#454545;stroke-miterlimit:10;}.cls-2{fill:none;stroke-linecap:round;stroke-width:60px;}</style>
+  </defs>
+  <title>search</title>
+  <path class="cls-1" d="M173,40.34A133.52,133.52,0,1,0,306.47,173.85,133.52,133.52,0,0,0,173,40.34Zm0,252.12a118.61,118.61,0,1,1,118.6-118.61A118.6,118.6,0,0,1,173,292.46Z"/>
+  <line class="cls-2" x1="269.72" x2="432.42" y1="279.01" y2="441.72"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/settings.svg b/org.argeo.app.theme.default/icons/types/svg/settings.svg
new file mode 100644 (file)
index 0000000..da3b784
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#454545;stroke-linecap:round;stroke-linejoin:round;stroke-width:20px;}.cls-1,.cls-2{stroke:#454545;}.cls-2{fill:none;stroke-miterlimit:10;stroke-width:50px;}</style>
+  </defs>
+  <title>settings</title>
+  <g id="Plus">
+    <rect class="cls-1" height="44.41" width="43.85" x="228.54" y="59.66"/>
+    <rect class="cls-1" height="44.41" width="43.85" x="395.17" y="219.53"/>
+    <rect class="cls-1" height="44.41" width="43.85" x="228.54" y="397.17"/>
+    <rect class="cls-1" height="44.41" width="43.85" x="61.92" y="228.41"/>
+    <polygon class="cls-1" points="158.69 366.08 127.69 397.48 96.68 366.08 127.69 334.68 158.69 366.08"/>
+    <polygon class="cls-1" points="404.25 366.08 373.24 397.48 342.24 366.08 373.24 334.68 404.25 366.08"/>
+    <polygon class="cls-1" points="404.25 135.16 373.24 166.56 342.24 135.16 373.24 103.75 404.25 135.16"/>
+    <polygon class="cls-1" points="167.46 126.27 136.46 157.68 105.45 126.27 136.46 94.87 167.46 126.27"/>
+    <circle class="cls-2" cx="250.48" cy="250.61" r="126.5"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/tag.svg b/org.argeo.app.theme.default/icons/types/svg/tag.svg
new file mode 100644 (file)
index 0000000..4ce586d
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:none;stroke:#454545;stroke-linecap:round;stroke-miterlimit:10;stroke-width:44px;}</style>
+  </defs>
+  <title>tag</title>
+  <g id="Plus">
+    <line class="cls-1" x1="218.31" x2="183.35" y1="84.43" y2="401.51"/>
+    <line class="cls-1" x1="327.65" x2="292.69" y1="88.49" y2="405.57"/>
+    <line class="cls-1" x1="373.91" x2="134.88" y1="186" y2="186"/>
+    <line class="cls-1" x1="363.91" x2="124.88" y1="294" y2="294"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/task.svg b/org.argeo.app.theme.default/icons/types/svg/task.svg
new file mode 100644 (file)
index 0000000..09e81ed
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#35987a;}.cls-2{fill:#fff;}.cls-3{fill:#007f00;stroke:#fff;stroke-linecap:round;stroke-miterlimit:10;stroke-width:50px;}</style>
+  </defs>
+  <title>task</title>
+  <rect class="cls-1" height="435.25" width="345.2" x="61" y="24.75"/>
+  <circle class="cls-2" cx="130" cy="133" r="24"/>
+  <line class="cls-3" x1="206" x2="335" y1="133" y2="133"/>
+  <line class="cls-3" x1="205" x2="334.67" y1="245" y2="244.93"/>
+  <line class="cls-3" x1="209" x2="334.67" y1="352" y2="352.24"/>
+  <circle class="cls-2" cx="130" cy="240" r="24"/>
+  <circle class="cls-2" cx="130" cy="352" r="24"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/task_1.svg b/org.argeo.app.theme.default/icons/types/svg/task_1.svg
new file mode 100644 (file)
index 0000000..246ea19
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#fff;}.cls-2{fill:#177f95;}.cls-3{fill:none;stroke:#177f95;stroke-linecap:round;stroke-linejoin:round;stroke-width:40px;}</style>
+  </defs>
+  <title>task_1</title>
+  <g id="Plus">
+    <rect class="cls-1" height="381" width="302" x="79" y="69"/>
+    <path class="cls-2" d="M367,83V436H93V83H367m16-28H77A12,12,0,0,0,65,67V452a12,12,0,0,0,12,12H383a12,12,0,0,0,12-12V67a12,12,0,0,0-12-12Z"/>
+    <path class="cls-1" d="M126.11,97.5a14.06,14.06,0,0,1-5.61-1V42.22a14.24,14.24,0,0,1,5.61-1h49.61L177.5,34c2.8-11.29,24.39-23.47,54.39-23.47S283.47,22.68,286.27,34l1.79,7.21h45.83a14.24,14.24,0,0,1,5.61,1V96.46a14.06,14.06,0,0,1-5.61,1Z"/>
+    <path class="cls-2" d="M231.89,20c12.79,0,24.88,2.46,34.05,6.93,7.91,3.85,10.73,7.79,11.11,9.33l3.58,14.42H330V88H130V50.68h53.15l3.58-14.42c.38-1.54,3.19-5.48,11.11-9.33C207,22.46,219.1,20,231.89,20m0-19c-32.48,0-59.31,13.35-63.61,30.68H126.11c-8.31,0-15.11,3.77-15.11,8.37V98.63c0,4.6,6.8,8.37,15.11,8.37H333.89c8.31,0,15.11-3.77,15.11-8.37V40.05c0-4.6-6.8-8.37-15.11-8.37h-38.4C291.2,14.35,264.37,1,231.89,1Z"/>
+    <polyline class="cls-3" points="137.05 294.2 220.48 351.96 321.55 167.46"/>
+    <ellipse class="cls-2" cx="230" cy="46.5" rx="19.5" ry="16.5"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/telephone.svg b/org.argeo.app.theme.default/icons/types/svg/telephone.svg
new file mode 100644 (file)
index 0000000..b74bc81
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#454545;}</style>
+  </defs>
+  <title>telephone</title>
+  <path class="cls-1" d="M394.07,312s-17.27-20.72-36.38-6.42c-14.24,10.65-39.84,34.34-46,40.08,0,0-42.79-22.81-68.11-43.64-37.51-30.84-62.59-68.92-75.73-90.58L158,192.93c3.42-3.68,29.63-31.74,41-47,14.27-19.1-6.42-36.36-6.42-36.36s-58.21-58.21-71.46-69.76S92.6,34.68,92.6,34.68c-27.89,18-56.78,33.68-58.5,109C34,214.2,87.57,286.92,145.44,343.22c58,63.6,137.61,127.32,214.55,127.25,75.31-1.69,91-30.6,109-58.49,0,0,6.44-15.25-5.12-28.51S394.07,312,394.07,312Z"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/timeLine.svg b/org.argeo.app.theme.default/icons/types/svg/timeLine.svg
new file mode 100644 (file)
index 0000000..45c5e7e
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1,.cls-2,.cls-4,.cls-6,.cls-8{fill:none;}.cls-1,.cls-7,.cls-8{stroke:#f3964d;}.cls-1,.cls-2,.cls-8{stroke-linecap:round;}.cls-1,.cls-2{stroke-linejoin:round;}.cls-1,.cls-7{stroke-width:20px;}.cls-2,.cls-4,.cls-6{stroke:#454545;}.cls-2,.cls-4{stroke-width:5px;}.cls-3{fill:#f3964d;}.cls-4,.cls-6,.cls-7,.cls-8{stroke-miterlimit:10;}.cls-5{fill:#6ac59a;}.cls-6{stroke-width:4px;}.cls-7{fill:#fff;}.cls-8{stroke-width:9px;}</style>
+  </defs>
+  <title>timeLine</title>
+  <g id="Plus">
+    <line class="cls-1" x1="55" x2="441" y1="422.36" y2="422.36"/>
+    <line class="cls-2" x1="62.5" x2="221.5" y1="216.34" y2="94.38"/>
+    <line class="cls-2" x1="221.5" x2="391.5" y1="94.86" y2="157.86"/>
+    <circle class="cls-3" cx="129" cy="166.36" r="20"/>
+    <circle class="cls-3" cx="222" cy="95.36" r="20"/>
+    <circle class="cls-3" cx="392" cy="158.36" r="20"/>
+    <line class="cls-4" x1="209" x2="55" y1="260.36" y2="382.36"/>
+    <line class="cls-1" x1="55" x2="55" y1="59.36" y2="422.36"/>
+    <circle class="cls-5" cx="116" cy="334.36" r="20"/>
+    <line class="cls-6" x1="209" x2="300" y1="260.36" y2="321.36"/>
+    <circle class="cls-5" cx="209" cy="260.36" r="20"/>
+    <line class="cls-4" x1="300" x2="407" y1="321.36" y2="246.36"/>
+    <circle class="cls-5" cx="300" cy="321.36" r="20"/>
+    <circle class="cls-5" cx="407" cy="246.36" r="20"/>
+    <circle class="cls-7" cx="417.83" cy="385.36" r="51"/>
+    <line class="cls-8" x1="417.83" x2="417.83" y1="387.36" y2="343.36"/>
+    <line class="cls-8" x1="417.33" x2="442.33" y1="387.86" y2="387.86"/>
+    <polyline class="cls-3" points="23.92 60.86 54.33 30.46 84.73 60.86"/>
+  </g>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/todo.svg b/org.argeo.app.theme.default/icons/types/svg/todo.svg
new file mode 100644 (file)
index 0000000..fa1652f
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" viewBox="0 0 500 500">
+  <defs>
+    <style>.cls-1{fill:#35987a;}.cls-2{fill:#6ac59a;stroke:#35987a;stroke-linecap:round;stroke-miterlimit:10;stroke-width:50px;}</style>
+  </defs>
+  <title>todo</title>
+  <path class="cls-1" d="M381,56.74V435H81V56.74H381m0-28H81a28,28,0,0,0-28,28V435a28,28,0,0,0,28,28H381a28,28,0,0,0,28-28V56.74a28,28,0,0,0-28-28Z"/>
+  <circle class="cls-1" cx="137" cy="147" r="23.5"/>
+  <path class="cls-1" d="M137,124a23,23,0,1,1-23,23,23,23,0,0,1,23-23m0-1a24,24,0,1,0,24,24,24,24,0,0,0-24-24Z"/>
+  <line class="cls-2" x1="206" x2="335" y1="147" y2="147"/>
+  <line class="cls-2" x1="205" x2="334.67" y1="259" y2="258.93"/>
+  <line class="cls-2" x1="209" x2="335" y1="366" y2="366"/>
+  <circle class="cls-1" cx="137" cy="254" r="23.5"/>
+  <path class="cls-1" d="M137,231a23,23,0,1,1-23,23,23,23,0,0,1,23-23m0-1a24,24,0,1,0,24,24,24,24,0,0,0-24-24Z"/>
+  <circle class="cls-1" cx="137" cy="366" r="23.5"/>
+  <path class="cls-1" d="M137,343a23,23,0,1,1-23,23,23,23,0,0,1,23-23m0-1a24,24,0,1,0,24,24,24,24,0,0,0-24-24Z"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/user.svg b/org.argeo.app.theme.default/icons/types/svg/user.svg
new file mode 100644 (file)
index 0000000..00997db
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" data-name="Layer 1" id="Layer_1" inkscape:version="0.92.2 5c3e80d, 2017-08-06" sodipodi:docname="user.svg" version="1.1" viewBox="0 0 500 500">
+  <metadata id="metadata15">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview bordercolor="#666666" borderopacity="1" gridtolerance="10" guidetolerance="10" id="namedview13" inkscape:current-layer="Layer_1" inkscape:cx="250" inkscape:cy="250" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="774" inkscape:window-maximized="0" inkscape:window-width="1317" inkscape:window-x="0" inkscape:window-y="0" inkscape:zoom="0.472" objecttolerance="10" pagecolor="#ffffff" showgrid="false"/>
+  <defs id="defs4">
+    <style id="style2">.cls-1{fill:#177f95;}.cls-2{fill:#fff;}</style>
+  </defs>
+  <title id="title6">user</title>
+  <path d="M 244.5 21 A 228.5 228.5 0 0 0 16 249.5 A 228.5 228.5 0 0 0 244.5 478 A 228.5 228.5 0 0 0 473 249.5 A 228.5 228.5 0 0 0 244.5 21 z M 244.5293 102.86914 C 277.3793 102.86914 304 136.15094 304 177.21094 C 304 209.00094 288.00008 235.84977 265.58008 246.50977 L 270.66992 264.73047 C 312.12992 277.63047 338.49016 320.26922 347.41016 369.69922 C 354.68016 410.05922 135.53906 399.41922 141.53906 369.69922 C 152.14906 316.78922 177.77906 275.79008 219.53906 264.08008 L 223.75 246.65039 C 201.16 236.11039 185 209.12094 185 177.21094 C 185 136.15094 211.6793 102.86914 244.5293 102.86914 z " id="circle8" style="fill:#177f95;fill-opacity:1"/>
+</svg>
diff --git a/org.argeo.app.theme.default/icons/types/svg/users.svg b/org.argeo.app.theme.default/icons/types/svg/users.svg
new file mode 100644 (file)
index 0000000..bb0e00d
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><defs><style>.cls-1{fill:#177f95;}.cls-2{fill:#fff;}</style></defs><title>users</title><path class="cls-1" d="M322.79,130.44a4.52,4.52,0,0,0-3.31-4.32L95.09,36.23H87.27c-5.8,0-7.82-.37-7.82,4.42V392c0,9.11,6.07,17.11,14.26,19.23L315,491.55h7.82Z"/><path class="cls-1" d="M346.47,119.76v334h50.75a22.13,22.13,0,0,0,22.1-22.1V231.31l.13-192.55a22.12,22.12,0,0,0-22.1-22.1H115.49L331.77,99.84A20.79,20.79,0,0,1,346.47,119.76Z"/><path class="cls-2" d="M222.47,282.62,217.4,263c17.56-3.41,29.08-24.9,27.41-56.25-2.15-40.55-25.42-81.87-52-92.29s-46.35,14-44.19,54.54c1.67,31.51,16.15,63.3,35,80.88l-2.49,15.87c-33.15-1.69-51.73,30.67-57.56,79.54-3.28,27.46,157.66,101.31,149.66,59.15C263.42,352.81,256.67,308.51,222.47,282.62Z"/></svg>
\ No newline at end of file
diff --git a/org.argeo.app.theme.default/rap/argeo.css b/org.argeo.app.theme.default/rap/argeo.css
new file mode 100644 (file)
index 0000000..0351d05
--- /dev/null
@@ -0,0 +1,151 @@
+.argeo-suite-header {
+       color: white;
+       background-color: #00294b;
+}
+
+.argeo-suite-headerTitle {
+       font: bold 24px sans-serif;
+       color: white;
+       background-color: #00294b;
+}
+
+.argeo-suite-leadPane {
+       background-color: #eee;
+}
+
+Label.argeo-suite-leadPane {
+       color: #888;
+       background-color: #eee;
+}
+
+Button.argeo-suite-leadPane:hover {
+       cursor:pointer;
+}
+
+.argeo-suite-recentItems {
+       font: bold 16px sans-serif;
+       color: white;
+       background-color: #00294b;
+       padding: 8px 16px;
+}
+
+.argeo-suite-titleContainer {
+       background-color: #00294b;
+       padding: 6px 8px 4px 8px;
+}
+
+.argeo-suite-titleLabel {
+       font: bold 16px sans-serif;
+       color: white;
+       background-color: #00294b;
+}
+
+.argeo-suite-subTitleLabel {
+       font: italic 16px sans-serif;
+       color: #777;
+       padding: 4px 8px;
+}
+
+.argeo-suite-simpleLabel {
+       font: bold 16px sans-serif;
+       padding: 0px;
+}
+
+.argeo-suite-simpleText {
+       font: 16px sans-serif;
+       padding: 0px;
+}
+
+.argeo-suite-titleCell {
+       font: bold 16px sans-serif;
+       background-color: #ddd;
+}
+
+.argeo-suite-inlineButton {
+       padding: 0px 4px;
+       font: 16px sans-serif;
+       border: 1px solid white;
+       color: white;
+       background-image: none;
+       background-color: #00294b;
+}
+
+.argeo-suite-inlineButton:hover {
+       color: #00294b;
+       background-color: white;
+}
+
+Composite.argeo-suite-mainTabBody {
+       background-color: #eee;
+       border: 1px solid #bbb;
+}
+
+.argeo-suite-mainTab {
+       background-color: #eee;
+       border: 1px solid #888;
+}
+
+ToolItem.argeo-suite-mainTab {
+       border: none;
+       background-color: #eee;
+}
+
+ToolItem.argeo-suite-mainTab:hover {
+       background-color: #eee;
+}
+
+
+Button.argeo-suite-mainTab {
+       border: 1px solid #eee;
+       background-color: #eee;
+}
+
+.argeo-suite-mainTab:hover {
+       background-color: #eee;
+}
+
+Button.argeo-suite-mainTab:hover {
+       cursor: pointer;
+       background-color: #eee;
+}
+
+.argeo-suite-mainTabSelected {
+       font: bold 16px sans-serif;
+       color: white;
+       /*background-color: #00294b;*/
+       background-color: #5882b5;
+       border:1px solid #888;
+}
+
+ToolItem.argeo-suite-mainTabSelected {
+       border: none;
+}
+
+ToolItem.argeo-suite-mainTabSelected:hover {
+       background-color: #5882b5;
+}
+
+Button.argeo-suite-mainTabSelected {
+       border: none;
+}
+
+.argeo-suite-navigationBar{
+       background-color:#ddd;
+}
+
+.argeo-suite-navigationTitle{
+       background-color:#ddd;
+       font:bold 16px sans-serif;
+}
+
+.argeo-suite-navigationButton{
+       color:#777;
+       background-color:#ddd;
+       font:bold 16px sans-serif;
+}
+
+.argeo-suite-navigationButton:hover{
+       cursor:pointer;
+       color:#ddd;
+       background-color:#777;
+}
diff --git a/org.argeo.app.theme.default/rap/defaults.css b/org.argeo.app.theme.default/rap/defaults.css
new file mode 100644 (file)
index 0000000..24b1f7c
--- /dev/null
@@ -0,0 +1,43 @@
+Display,
+Label,
+Text,
+Tree,
+Table,
+Button,
+TreeColumn,
+TableColumn,
+{
+       font: 16px sans-serif;
+}
+
+Sash {
+  border: 1px solid white;
+  background-image: none;
+  background-color: white;
+}
+
+Sash:hover {
+  border: 1px solid #5882b5;
+  background-color: #5882b5;
+}
+
+Tree-Cell {
+    padding: 3px 3px 0px;
+    spacing: 3px;
+}
+
+Table-Cell {
+    padding: 3px 3px 0px;
+    spacing: 5px;
+}
+
+Tree-RowOverlay:selected {
+       color:#fff;
+       background-color:#5882b5;
+}
+
+Table-RowOverlay:selected {
+       color:#fff;
+       background-color:#5882b5;
+}
+
diff --git a/org.argeo.app.theme.default/src/.gitignore b/org.argeo.app.theme.default/src/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/org.argeo.app.theme.default/swt/app.css b/org.argeo.app.theme.default/swt/app.css
new file mode 100644 (file)
index 0000000..4ac745d
--- /dev/null
@@ -0,0 +1,129 @@
+.argeo-suite-header {
+       color: white;
+       background-color: #00294b;
+}
+
+.argeo-suite-headerTitle {
+       font: bold 14px sans-serif;
+       color: white;
+       background-color: #00294b;
+}
+
+.argeo-suite-leadPane {
+       background-color: #eee;
+}
+
+Label.argeo-suite-leadPane {
+       font: 11px sans-serif;
+       color: #888;
+       background-color: #eee;
+}
+
+Button.argeo-suite-leadPane:hover {
+       cursor: pointer;
+}
+
+.argeo-suite-recentItems {
+       font: bold 13px sans-serif;
+       color: white;
+       background-color: #00294b;
+       padding: 8px 16px;
+}
+
+.argeo-suite-titleContainer {
+       background-color: #00294b;
+}
+
+.argeo-suite-titleLabel {
+       font: bold 13px sans-serif;
+       margin: 6px 8px 4px 8px;
+       color: white;
+       background-color: #00294b;
+}
+
+.argeo-suite-subTitleLabel {
+       font: italic 14px sans-serif;
+       color: #777;
+       margin: 4px 8px;
+}
+
+.argeo-suite-formLine {
+       padding: 4px 8px 4px 16px;
+}
+
+.argeo-suite-simpleLabel {
+       font: normal 11px sans-serif;
+       border: 8px solid #eee;
+}
+
+.argeo-suite-simpleText {
+       
+}
+
+.argeo-suite-simpleInput {
+       padding: 4px 8px 4px 8px;
+}
+
+.argeo-suite-titleCell {
+       font: bold 11px sans-serif;
+       background-color: #ddd;
+}
+
+.argeo-suite-inlineButton {
+       padding: 0px 4px;
+       font: 12px sans-serif;
+       border: 1px solid white;
+       color: white;
+       background-image: none;
+       background-color: #00294b;
+}
+
+.argeo-suite-inlineButton:hover {
+       color: #00294b;
+       background-color: white;
+}
+
+Composite.argeo-suite-mainTabBody {
+       background-color: #eee;
+       border: 1px solid #bbb;
+}
+
+.argeo-suite-mainTab {
+       background-color: #eee;
+       border: 1px solid #bbb;
+}
+
+ToolItem.argeo-suite-mainTab {
+       border: none;
+       background-color: #eee;
+}
+
+Button.argeo-suite-mainTab {
+       border: none;
+       background-color: #eee;
+}
+
+.argeo-suite-mainTab:hover {
+       background-color: #eee;
+}
+
+Button.argeo-suite-mainTab:hover {
+       cursor: pointer;
+       background-color: #eee;
+}
+
+.argeo-suite-mainTabSelected {
+       font: bold 14px sans-serif;
+       color: white;
+       /*background-color: #00294b;*/
+       background-color: #5882b5;
+       border: 1px solid #00294b;
+}
+
+ToolItem.argeo-suite-mainTabSelected {
+       border: none;
+}
+
+Button.argeo-suite-mainTabSelected {
+       border: none;
+}
\ No newline at end of file
diff --git a/org.argeo.suite.knowledge/.classpath b/org.argeo.suite.knowledge/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.argeo.suite.knowledge/.project b/org.argeo.suite.knowledge/.project
new file mode 100644 (file)
index 0000000..1e58e0d
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.suite.knowledge</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/org.argeo.suite.knowledge/OSGI-INF/l10n/bundle.properties b/org.argeo.suite.knowledge/OSGI-INF/l10n/bundle.properties
new file mode 100644 (file)
index 0000000..a750a7a
--- /dev/null
@@ -0,0 +1 @@
+appTitle=Argeo Knowledge
diff --git a/org.argeo.suite.knowledge/OSGI-INF/leadPane.xml b/org.argeo.suite.knowledge/OSGI-INF/leadPane.xml
new file mode 100644 (file)
index 0000000..81a880c
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="argeo.product.knowledge.leadPane">
+   <implementation class="org.argeo.app.swt.ux.DefaultLeadPane"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/leadPane.properties"/>
+   <property name="defaultLayers" type="String">argeo.product.knowledge.structureLayer
+argeo.product.knowledge.termsLayer
+   </property>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+</scr:component>
diff --git a/org.argeo.suite.knowledge/OSGI-INF/spaceEntryArea.xml b/org.argeo.suite.knowledge/OSGI-INF/spaceEntryArea.xml
new file mode 100644 (file)
index 0000000..34f9278
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="argeo.product.knowledge.spaceEntryArea">
+   <implementation class="org.argeo.app.swt.space.SpaceEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/spaceEntryArea.properties"/>
+</scr:component>
diff --git a/org.argeo.suite.knowledge/OSGI-INF/structureLayer.xml b/org.argeo.suite.knowledge/OSGI-INF/structureLayer.xml
new file mode 100644 (file)
index 0000000..5d77e20
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="argeo.product.knowledge.structureLayer">
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
+   <service>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/structureLayer.properties"/>
+   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.product.knowledge.spaceEntryArea)"/>
+</scr:component>
diff --git a/org.argeo.suite.knowledge/OSGI-INF/swtArgeoApp.xml b/org.argeo.suite.knowledge/OSGI-INF/swtArgeoApp.xml
new file mode 100644 (file)
index 0000000..314a0e4
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="argeo.product.knowledge.swtArgeoApp">
+   <implementation class="org.argeo.app.swt.ux.SwtArgeoApp"/>
+   <service>
+      <provide interface="org.argeo.api.cms.CmsApp"/>
+   </service>
+   <properties entry="config/swtArgeoApp.properties"/>
+   <reference bind="addUiProvider" cardinality="0..n" interface="org.argeo.cms.swt.acr.SwtUiProvider" policy="dynamic" unbind="removeUiProvider"/>
+   <reference bind="addTheme" cardinality="1..n" interface="org.argeo.api.cms.ux.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+   <reference bind="setCmsContext" cardinality="1..1" interface="org.argeo.api.cms.CmsContext" name="CmsContext" policy="static"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.ContentRepository" name="ContentRepository" policy="static"/>
+   <reference bind="setAppUserState" cardinality="1..1" interface="org.argeo.api.app.AppUserState" name="AppUserState" policy="static"/>
+</scr:component>
diff --git a/org.argeo.suite.knowledge/OSGI-INF/termsEntryArea.xml b/org.argeo.suite.knowledge/OSGI-INF/termsEntryArea.xml
new file mode 100644 (file)
index 0000000..187f6e2
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="argeo.product.knowledge.termsEntryArea">
+   <implementation class="org.argeo.app.swt.terms.TermsEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/termsEntryArea.properties"/>
+   <reference bind="setTermsManager" cardinality="1..1" interface="org.argeo.api.app.TermsManager" name="TermsManager" policy="static"/>
+</scr:component>
diff --git a/org.argeo.suite.knowledge/OSGI-INF/termsLayer.xml b/org.argeo.suite.knowledge/OSGI-INF/termsLayer.xml
new file mode 100644 (file)
index 0000000..c3e8882
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="argeo.product.knowledge.termsLayer">
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
+   <service>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/termsLayer.properties"/>
+   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.product.knowledge.termsEntryArea)"/>
+</scr:component>
diff --git a/org.argeo.suite.knowledge/bnd.bnd b/org.argeo.suite.knowledge/bnd.bnd
new file mode 100644 (file)
index 0000000..ef68882
--- /dev/null
@@ -0,0 +1,15 @@
+Service-Component:\
+OSGI-INF/swtArgeoApp.xml,\
+OSGI-INF/leadPane.xml,\
+OSGI-INF/spaceEntryArea.xml,\
+OSGI-INF/structureLayer.xml,\
+OSGI-INF/termsEntryArea.xml,\
+OSGI-INF/termsLayer.xml,\
+
+Import-Package:\
+org.argeo.api.app,\
+org.argeo.cms.swt.acr;resolution:=optional,\
+org.argeo.app.swt.ux;resolution:=optional,\
+org.argeo.app.swt.terms;resolution:=optional,\
+org.argeo.app.swt.space;resolution:=optional,\
+*
\ No newline at end of file
diff --git a/org.argeo.suite.knowledge/build.properties b/org.argeo.suite.knowledge/build.properties
new file mode 100644 (file)
index 0000000..fde2b82
--- /dev/null
@@ -0,0 +1,5 @@
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/swtArgeoApp.xml
+source.. = src/
+output.. = bin/
diff --git a/org.argeo.suite.knowledge/config/leadPane.properties b/org.argeo.suite.knowledge/config/leadPane.properties
new file mode 100644 (file)
index 0000000..ce3538f
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.product.knowledge.leadPane
diff --git a/org.argeo.suite.knowledge/config/spaceEntryArea.properties b/org.argeo.suite.knowledge/config/spaceEntryArea.properties
new file mode 100644 (file)
index 0000000..09bbf25
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.product.knowledge.spaceEntryArea
diff --git a/org.argeo.suite.knowledge/config/structureLayer.properties b/org.argeo.suite.knowledge/config/structureLayer.properties
new file mode 100644 (file)
index 0000000..14b9f6b
--- /dev/null
@@ -0,0 +1,6 @@
+service.pid=argeo.product.knowledge.structureLayer
+
+title=Structure
+icon=folder
+
+#entity.type=entity:space
\ No newline at end of file
diff --git a/org.argeo.suite.knowledge/config/swtArgeoApp.properties b/org.argeo.suite.knowledge/config/swtArgeoApp.properties
new file mode 100644 (file)
index 0000000..d93d41c
--- /dev/null
@@ -0,0 +1,7 @@
+service.pid=argeo.product.knowledge.swtArgeoApp
+
+sharedPidPrefix=argeo.suite.ui
+
+event.topics=argeo/suite/*
+
+argeo.cms.app.contextName=argeo/knowledge
\ No newline at end of file
diff --git a/org.argeo.suite.knowledge/config/termsEntryArea.properties b/org.argeo.suite.knowledge/config/termsEntryArea.properties
new file mode 100644 (file)
index 0000000..2a36034
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.product.knowledge.termsEntryArea
diff --git a/org.argeo.suite.knowledge/config/termsLayer.properties b/org.argeo.suite.knowledge/config/termsLayer.properties
new file mode 100644 (file)
index 0000000..e6b9a09
--- /dev/null
@@ -0,0 +1,6 @@
+service.pid=argeo.product.knowledge.termsLayer
+
+title=Terms
+icon=dashboard
+
+entity.type=entity:terms,entity:term,entity:typologies
\ No newline at end of file
diff --git a/org.argeo.suite.knowledge/src/.gitignore b/org.argeo.suite.knowledge/src/.gitignore
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/people/.gitignore b/people/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/people/org.argeo.people.ui/.classpath b/people/org.argeo.people.ui/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/people/org.argeo.people.ui/.gitignore b/people/org.argeo.people.ui/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/people/org.argeo.people.ui/.project b/people/org.argeo.people.ui/.project
deleted file mode 100644 (file)
index b3d17df..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.people.ui</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/people/org.argeo.people.ui/META-INF/.gitignore b/people/org.argeo.people.ui/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/people/org.argeo.people.ui/OSGI-INF/l10n/bundle.properties b/people/org.argeo.people.ui/OSGI-INF/l10n/bundle.properties
deleted file mode 100644 (file)
index e619de4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-people=people
diff --git a/people/org.argeo.people.ui/OSGI-INF/peopleEntryArea.xml b/people/org.argeo.people.ui/OSGI-INF/peopleEntryArea.xml
deleted file mode 100644 (file)
index 9601294..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-   <implementation class="org.argeo.people.ui.PeopleEntryArea"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/peopleEntryArea.properties"/>
-   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.cms.CmsUserManager" name="CmsUserManager" policy="static"/>
-</scr:component>
diff --git a/people/org.argeo.people.ui/OSGI-INF/peopleLayer.xml b/people/org.argeo.people.ui/OSGI-INF/peopleLayer.xml
deleted file mode 100644 (file)
index 09392aa..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
-   <implementation class="org.argeo.suite.ui.DefaultEditionLayer"/>
-   <properties entry="config/peopleLayer.properties"/>
-   <service>
-      <provide interface="org.argeo.suite.ui.SuiteLayer"/>
-   </service>
-   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.ui.CmsUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.people.ui.peopleEntryArea)"/>
-</scr:component>
diff --git a/people/org.argeo.people.ui/OSGI-INF/personUiProvider.xml b/people/org.argeo.people.ui/OSGI-INF/personUiProvider.xml
deleted file mode 100644 (file)
index abd2d8d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init">
-   <implementation class="org.argeo.people.ui.PersonUiProvider"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/personUiProvider.properties"/>
-   <property name="availableRoles" type="String">
-   </property>
-   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.cms.CmsUserManager" name="CmsUserManager" policy="static"/>
-</scr:component>
diff --git a/people/org.argeo.people.ui/bnd.bnd b/people/org.argeo.people.ui/bnd.bnd
deleted file mode 100644 (file)
index 1b92ebb..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-Import-Package:\
-javax.jcr.nodetype,\
-org.osgi.service.event,\
-org.argeo.suite.ui,\
-org.argeo.api,\
-org.eclipse.swt,\
-org.eclipse.jface.viewers,\
-org.eclipse.jface.window,\
-org.osgi.framework,\
-*
-
-Service-Component:\
-OSGI-INF/peopleLayer.xml,\
-OSGI-INF/personUiProvider.xml,\
-OSGI-INF/peopleEntryArea.xml
-
diff --git a/people/org.argeo.people.ui/build.properties b/people/org.argeo.people.ui/build.properties
deleted file mode 100644 (file)
index 34d2e4d..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/people/org.argeo.people.ui/config/peopleEntryArea.properties b/people/org.argeo.people.ui/config/peopleEntryArea.properties
deleted file mode 100644 (file)
index 37b28f9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-service.pid=argeo.people.ui.peopleEntryArea
diff --git a/people/org.argeo.people.ui/config/peopleLayer.properties b/people/org.argeo.people.ui/config/peopleLayer.properties
deleted file mode 100644 (file)
index adadb7b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-service.pid=argeo.people.ui.peopleLayer
-
-icon=people
-weights=5000,5000
-title=%people
-
-entity.type=entity:person
\ No newline at end of file
diff --git a/people/org.argeo.people.ui/config/personUiProvider.properties b/people/org.argeo.people.ui/config/personUiProvider.properties
deleted file mode 100644 (file)
index 8c40c7d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-service.pid=argeo.people.ui.personUiProvider
-
-entity.type=entity:person
\ No newline at end of file
diff --git a/people/org.argeo.people.ui/pom.xml b/people/org.argeo.people.ui/pom.xml
deleted file mode 100644 (file)
index 07589a4..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>people</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.people.ui</artifactId>
-       <name>People UI</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Eclipse E4 -->
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp-rap-e4</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <type>pom</type>
-                       <scope>provided</scope>
-               </dependency>
-               <!-- Specific -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <scope>provided</scope>
-               </dependency>
-
-       </dependencies>
-</project>
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/PeopleEntryArea.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/PeopleEntryArea.java
deleted file mode 100644 (file)
index 2fd38da..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-package org.argeo.people.ui;
-
-import java.util.Set;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.dialogs.CmsWizardDialog;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.Selected;
-import org.argeo.naming.LdapAttrs;
-import org.argeo.suite.SuiteRole;
-import org.argeo.suite.ui.SuiteEvent;
-import org.argeo.suite.ui.SuiteIcon;
-import org.argeo.suite.ui.dialogs.NewUserWizard;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.osgi.service.useradmin.User;
-
-/** Entry to the admin area. */
-public class PeopleEntryArea implements CmsUiProvider {
-
-       private CmsUserManager cmsUserManager;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               CmsTheme theme = CmsTheme.getCmsTheme(parent);
-               parent.setLayout(new GridLayout());
-               TableViewer usersViewer = new TableViewer(parent);
-               usersViewer.setContentProvider(new UsersContentProvider());
-
-               TableViewerColumn idCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               idCol.getColumn().setWidth(70);
-               idCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.uid.name());
-                       }
-               });
-
-               TableViewerColumn givenNameCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               givenNameCol.getColumn().setWidth(150);
-               givenNameCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.givenName.name());
-                       }
-               });
-
-               TableViewerColumn snCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               snCol.getColumn().setWidth(150);
-               snCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.sn.name());
-                       }
-               });
-
-               TableViewerColumn mailCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               mailCol.getColumn().setWidth(400);
-               mailCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.mail.name());
-                       }
-               });
-
-               Composite bottom = new Composite(parent, SWT.NONE);
-               bottom.setLayoutData(CmsUiUtils.fillWidth());
-               bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
-               ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
-               bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
-               ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
-               deleteItem.setEnabled(false);
-//             CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
-               deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
-               ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
-               addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
-               usersViewer.addDoubleClickListener(new IDoubleClickListener() {
-
-                       @Override
-                       public void doubleClick(DoubleClickEvent event) {
-                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
-                               if (user != null) {
-//                                     Node userNode = getOrCreateUserNode(user, context);
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
-                                                       SuiteEvent.eventProperties(user));
-                               }
-
-                       }
-               });
-               usersViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-                       public void selectionChanged(SelectionChangedEvent event) {
-                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
-                               if (user != null) {
-//                                     Node userNode = getOrCreateUserNode(user, context);
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
-                                                       SuiteEvent.eventProperties(user));
-                                       deleteItem.setEnabled(true);
-                               } else {
-                                       deleteItem.setEnabled(false);
-                               }
-                       }
-               });
-
-               addItem.addSelectionListener((Selected) (e) -> {
-                       // SuiteUtils.getOrCreateUserNode(adminSession, userDn);
-                       Wizard wizard = new NewUserWizard(null);
-                       CmsWizardDialog dialog = new CmsWizardDialog(parent.getShell(), wizard);
-                       // WizardDialog dialog = new WizardDialog(shell, wizard);
-                       if (dialog.open() == Window.OK) {
-                               // TODO create
-                       }
-               });
-
-               usersViewer.getTable().setLayoutData(CmsUiUtils.fillAll());
-               usersViewer.setInput(cmsUserManager);
-
-               return usersViewer.getTable();
-       }
-
-//     private Node getOrCreateUserNode(User user, Node context) {
-//             return JcrUtils.mkdirs(Jcr.getSession(context),
-//                             "/" + EntityType.user.name() + "/" + getUserProperty(user, LdapAttrs.uid.name()),
-//                             EntityType.user.get());
-//     }
-
-       private String getUserProperty(Object element, String key) {
-               Object value = ((User) element).getProperties().get(key);
-               return value != null ? value.toString() : null;
-       }
-
-       class UsersContentProvider implements IStructuredContentProvider {
-
-               @Override
-               public Object[] getElements(Object inputElement) {
-                       CmsUserManager cum = (CmsUserManager) inputElement;
-                       Set<User> users = cum.listUsersInGroup(SuiteRole.coworker.dn(), null);
-                       return users.toArray();
-               }
-
-               @Override
-               public void dispose() {
-               }
-
-               @Override
-               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-               }
-
-       }
-
-       public void setCmsUserManager(CmsUserManager cmsUserManager) {
-               this.cmsUserManager = cmsUserManager;
-       }
-
-}
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/PersonUiProvider.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/PersonUiProvider.java
deleted file mode 100644 (file)
index d2ea2fe..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.argeo.people.ui;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.naming.LdapAttrs;
-import org.argeo.suite.ui.SuiteMsg;
-import org.argeo.suite.ui.SuiteUiUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.service.useradmin.User;
-
-/** Edit a suite user. */
-public class PersonUiProvider implements CmsUiProvider {
-       private String[] availableRoles;
-       private CmsUserManager cmsUserManager;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               Section main = new Section(parent, SWT.NONE, context);
-               main.setLayoutData(CmsUiUtils.fillAll());
-
-               String uid = context.getName();
-               User user = cmsUserManager.getUserFromLocalId(uid);
-
-//             Text givenName = new Text(main, SWT.SINGLE);
-//             givenName.setText(getUserProperty(user, LdapAttrs.givenName.name()));
-               Text givenName = SuiteUiUtils.addFormInput(main, SuiteMsg.firstName.lead(),
-                               getUserProperty(user, LdapAttrs.givenName.name()));
-
-               Text sn = SuiteUiUtils.addFormInput(main, SuiteMsg.lastName.lead(), getUserProperty(user, LdapAttrs.sn.name()));
-               // sn.setText(getUserProperty(user, LdapAttrs.sn.name()));
-
-               Text email = SuiteUiUtils.addFormInput(main, SuiteMsg.email.lead(),
-                               getUserProperty(user, LdapAttrs.mail.name()));
-               // email.setText(getUserProperty(user, LdapAttrs.mail.name()));
-
-               Text uidT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name()));
-               uidT.setText(uid);
-
-//             Label dnL = new Label(main, SWT.NONE);
-//             dnL.setText(user.getName());
-
-               // roles
-               // Section rolesSection = new Section(main, SWT.NONE, context);
-               Group rolesSection = new Group(main, SWT.NONE);
-               rolesSection.setText("Roles");
-               rolesSection.setLayoutData(CmsUiUtils.fillWidth());
-               rolesSection.setLayout(new GridLayout());
-               // new Label(rolesSection, SWT.NONE).setText("Roles:");
-               List<String> roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName()));
-               for (String role : availableRoles) {
-                       // new Label(rolesSection, SWT.NONE).setText(role);
-                       Button radio = new Button(rolesSection, SWT.CHECK);
-                       radio.setText(role);
-                       if (roles.contains(role))
-                               radio.setSelection(true);
-               }
-
-               return main;
-       }
-
-       public void setCmsUserManager(CmsUserManager cmsUserManager) {
-               this.cmsUserManager = cmsUserManager;
-       }
-
-       private String getUserProperty(Object element, String key) {
-               Object value = ((User) element).getProperties().get(key);
-               return value != null ? value.toString() : null;
-       }
-
-       public void init(Map<String, Object> properties) {
-               availableRoles = (String[]) properties.get("availableRoles");
-       }
-}
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUserUiProvider.java
deleted file mode 100644 (file)
index aa83cd2..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.argeo.people.ui;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.naming.LdapAttrs;
-import org.argeo.suite.ui.SuiteMsg;
-import org.argeo.suite.ui.SuiteUiUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-import org.osgi.service.useradmin.User;
-
-/** Edit a suite user. */
-public class SuiteUserUiProvider implements CmsUiProvider {
-       private String[] availableRoles;
-       private CmsUserManager cmsUserManager;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               Section main = new Section(parent, SWT.NONE, context);
-               main.setLayoutData(CmsUiUtils.fillAll());
-
-               String uid = context.getName();
-               User user = cmsUserManager.getUserFromLocalId(uid);
-
-//             Text givenName = new Text(main, SWT.SINGLE);
-//             givenName.setText(getUserProperty(user, LdapAttrs.givenName.name()));
-               Text givenName = SuiteUiUtils.addFormInput(main, SuiteMsg.firstName.lead(),
-                               getUserProperty(user, LdapAttrs.givenName.name()));
-
-               Text sn = SuiteUiUtils.addFormInput(main, SuiteMsg.lastName.lead(), getUserProperty(user, LdapAttrs.sn.name()));
-               // sn.setText(getUserProperty(user, LdapAttrs.sn.name()));
-
-               Text email = SuiteUiUtils.addFormInput(main, SuiteMsg.email.lead(),
-                               getUserProperty(user, LdapAttrs.mail.name()));
-               // email.setText(getUserProperty(user, LdapAttrs.mail.name()));
-
-               Text uidT = SuiteUiUtils.addFormLine(main, "uid", getUserProperty(user, LdapAttrs.uid.name()));
-               uidT.setText(uid);
-
-//             Label dnL = new Label(main, SWT.NONE);
-//             dnL.setText(user.getName());
-
-               // roles
-               // Section rolesSection = new Section(main, SWT.NONE, context);
-               Group rolesSection = new Group(main, SWT.NONE);
-               rolesSection.setText("Roles");
-               rolesSection.setLayoutData(CmsUiUtils.fillWidth());
-               rolesSection.setLayout(new GridLayout());
-               // new Label(rolesSection, SWT.NONE).setText("Roles:");
-               List<String> roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName()));
-               for (String role : availableRoles) {
-                       // new Label(rolesSection, SWT.NONE).setText(role);
-                       Button radio = new Button(rolesSection, SWT.CHECK);
-                       radio.setText(role);
-                       if (roles.contains(role))
-                               radio.setSelection(true);
-               }
-
-               return main;
-       }
-
-       public void setCmsUserManager(CmsUserManager cmsUserManager) {
-               this.cmsUserManager = cmsUserManager;
-       }
-
-       private String getUserProperty(Object element, String key) {
-               Object value = ((User) element).getProperties().get(key);
-               return value != null ? value.toString() : null;
-       }
-
-       public void init(Map<String, Object> properties) {
-               availableRoles = (String[]) properties.get("availableRoles");
-       }
-}
diff --git a/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java b/people/org.argeo.people.ui/src/org/argeo/people/ui/SuiteUsersEntryArea.java
deleted file mode 100644 (file)
index 66f3eda..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-package org.argeo.people.ui;
-
-import java.util.Set;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsUserManager;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.CmsView;
-import org.argeo.cms.ui.dialogs.CmsWizardDialog;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.eclipse.ui.Selected;
-import org.argeo.naming.LdapAttrs;
-import org.argeo.suite.SuiteRole;
-import org.argeo.suite.ui.SuiteEvent;
-import org.argeo.suite.ui.SuiteIcon;
-import org.argeo.suite.ui.dialogs.NewUserWizard;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.osgi.service.useradmin.User;
-
-/** Entry to the admin area. */
-public class SuiteUsersEntryArea implements CmsUiProvider {
-
-       private CmsUserManager cmsUserManager;
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               CmsTheme theme = CmsTheme.getCmsTheme(parent);
-               parent.setLayout(new GridLayout());
-               TableViewer usersViewer = new TableViewer(parent);
-               usersViewer.setContentProvider(new UsersContentProvider());
-
-               TableViewerColumn idCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               idCol.getColumn().setWidth(70);
-               idCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.uid.name());
-                       }
-               });
-
-               TableViewerColumn givenNameCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               givenNameCol.getColumn().setWidth(150);
-               givenNameCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.givenName.name());
-                       }
-               });
-
-               TableViewerColumn snCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               snCol.getColumn().setWidth(150);
-               snCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.sn.name());
-                       }
-               });
-
-               TableViewerColumn mailCol = new TableViewerColumn(usersViewer, SWT.NONE);
-               mailCol.getColumn().setWidth(400);
-               mailCol.setLabelProvider(new ColumnLabelProvider() {
-
-                       @Override
-                       public String getText(Object element) {
-
-                               return getUserProperty(element, LdapAttrs.mail.name());
-                       }
-               });
-
-               Composite bottom = new Composite(parent, SWT.NONE);
-               bottom.setLayoutData(CmsUiUtils.fillWidth());
-               bottom.setLayout(CmsUiUtils.noSpaceGridLayout());
-               ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
-               bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
-               ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
-               deleteItem.setEnabled(false);
-//             CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
-               deleteItem.setImage(SuiteIcon.delete.getSmallIcon(theme));
-               ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
-               addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
-               usersViewer.addDoubleClickListener(new IDoubleClickListener() {
-
-                       @Override
-                       public void doubleClick(DoubleClickEvent event) {
-                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
-                               if (user != null) {
-//                                     Node userNode = getOrCreateUserNode(user, context);
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.openNewPart.topic(),
-                                                       SuiteEvent.eventProperties(user));
-                               }
-
-                       }
-               });
-               usersViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-                       public void selectionChanged(SelectionChangedEvent event) {
-                               User user = (User) usersViewer.getStructuredSelection().getFirstElement();
-                               if (user != null) {
-//                                     Node userNode = getOrCreateUserNode(user, context);
-                                       CmsView.getCmsView(parent).sendEvent(SuiteEvent.refreshPart.topic(),
-                                                       SuiteEvent.eventProperties(user));
-                                       deleteItem.setEnabled(true);
-                               } else {
-                                       deleteItem.setEnabled(false);
-                               }
-                       }
-               });
-
-               addItem.addSelectionListener((Selected) (e) -> {
-                       // SuiteUtils.getOrCreateUserNode(adminSession, userDn);
-                       Wizard wizard = new NewUserWizard(null);
-                       CmsWizardDialog dialog = new CmsWizardDialog(parent.getShell(), wizard);
-                       // WizardDialog dialog = new WizardDialog(shell, wizard);
-                       if (dialog.open() == Window.OK) {
-                               // TODO create
-                       }
-               });
-
-               usersViewer.getTable().setLayoutData(CmsUiUtils.fillAll());
-               usersViewer.setInput(cmsUserManager);
-
-               return usersViewer.getTable();
-       }
-
-//     private Node getOrCreateUserNode(User user, Node context) {
-//             return JcrUtils.mkdirs(Jcr.getSession(context),
-//                             "/" + EntityType.user.name() + "/" + getUserProperty(user, LdapAttrs.uid.name()),
-//                             EntityType.user.get());
-//     }
-
-       private String getUserProperty(Object element, String key) {
-               Object value = ((User) element).getProperties().get(key);
-               return value != null ? value.toString() : null;
-       }
-
-       class UsersContentProvider implements IStructuredContentProvider {
-
-               @Override
-               public Object[] getElements(Object inputElement) {
-                       CmsUserManager cum = (CmsUserManager) inputElement;
-                       Set<User> users = cum.listUsersInGroup(SuiteRole.coworker.dn(), null);
-                       return users.toArray();
-               }
-
-               @Override
-               public void dispose() {
-               }
-
-               @Override
-               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-               }
-
-       }
-
-       public void setCmsUserManager(CmsUserManager cmsUserManager) {
-               this.cmsUserManager = cmsUserManager;
-       }
-
-}
diff --git a/people/pom.xml b/people/pom.xml
deleted file mode 100644 (file)
index 193f633..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>people</artifactId>
-       <name>Argeo People Components</name>
-       <packaging>pom</packaging>
-       <modules>
-               <module>org.argeo.people.ui</module>
-       </modules>
-</project>
diff --git a/pom.xml b/pom.xml
deleted file mode 100644 (file)
index bee12d0..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,202 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.maven</groupId>
-               <artifactId>argeo-osgi-parent</artifactId>
-               <version>2.1.3</version>
-       </parent>
-       <groupId>org.argeo.suite</groupId>
-       <artifactId>argeo-suite</artifactId>
-       <version>2.3.1-SNAPSHOT</version>
-       <name>Argeo Suite</name>
-       <packaging>pom</packaging>
-       <url>http://www.argeo.org/</url>
-       <properties>
-               <!-- Dependencies -->
-               <version.argeo-tp>2.1.27</version.argeo-tp>
-               <version.argeo-tp-extras>2.1.13</version.argeo-tp-extras>
-               <version.argeo-commons>[2.1.102,2.3.0-SNAPSHOT)</version.argeo-commons>
-               <version.argeo-suite-icons>[2.1.1,2.3.0-SNAPSHOT)</version.argeo-suite-icons>
-
-               <argeo.rpm.stagingRepository>/srv/rpmfactory/unstable/argeo-osgi-2/argeo</argeo.rpm.stagingRepository>
-               <git.rw />
-       </properties>
-       <modules>
-               <module>core</module>
-               <!-- Functional areas -->
-               <module>people</module>
-               <module>library</module>
-               <module>environment</module>
-               <module>publishing</module>
-               <module>knowledge</module>
-
-               <!-- Packaging -->
-               <module>dep</module>
-               <module>dist</module>
-               <module>lib</module>
-       </modules>
-       <scm>
-               <connection>scm:git:http://git.argeo.org/gpl/argeo-suite.git</connection>
-               <url>http://git.argeo.org/?p=gpl/argeo-suite.git;a=summary</url>
-               <developerConnection>scm:git:https://code.argeo.org/git/gpl/argeo-suite.git</developerConnection>
-               <tag>HEAD</tag>
-       </scm>
-       <organization>
-               <name>Argeo GmbH</name>
-       </organization>
-       <inceptionYear>2014</inceptionYear>
-       <licenses>
-               <license>
-                       <name>GPL-3.0-or-later</name>
-                       <url>http://www.gnu.org/licenses/gpl-3.0.txt</url>
-                       <distribution>repo</distribution>
-               </license>
-       </licenses>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <scope>provided</scope>
-                       <exclusions>
-                               <exclusion>
-                                       <groupId>org.argeo.tp.apache</groupId>
-                                       <artifactId>org.apache.xerces</artifactId>
-                               </exclusion>
-                               <!-- Avoid slf4j implementations lurking in the classpath. -->
-                               <exclusion>
-                                       <groupId>org.argeo.tp.sdk</groupId>
-                                       <artifactId>biz.aQute.bndlib</artifactId>
-                               </exclusion>
-                               <exclusion>
-                                       <groupId>org.argeo.tp.misc</groupId>
-                                       <artifactId>slf4j.osgi</artifactId>
-                               </exclusion>
-                       </exclusions>
-               </dependency>
-       </dependencies>
-       <dependencyManagement>
-               <dependencies>
-                       <dependency>
-                               <groupId>org.argeo.tp</groupId>
-                               <artifactId>argeo-tp</artifactId>
-                               <version>${version.argeo-tp}</version>
-                               <type>pom</type>
-                               <scope>import</scope>
-                       </dependency>
-                       <dependency>
-                               <groupId>org.argeo.tp</groupId>
-                               <artifactId>argeo-tp-rap-e4</artifactId>
-                               <version>${version.argeo-tp}</version>
-                               <type>pom</type>
-                               <scope>import</scope>
-                       </dependency>
-               </dependencies>
-       </dependencyManagement>
-       <repositories>
-               <repository>
-                       <id>argeo</id>
-                       <url>http://forge.argeo.org/data/java/argeo-2.1/</url>
-                       <releases>
-                               <enabled>true</enabled>
-                               <updatePolicy>daily</updatePolicy>
-                               <checksumPolicy>warn</checksumPolicy>
-                       </releases>
-                       <snapshots>
-                               <enabled>false</enabled>
-                       </snapshots>
-               </repository>
-               <repository>
-                       <id>argeo-unstable</id>
-                       <url>http://forge.argeo.org/data/java/argeo-2.3/</url>
-                       <releases>
-                               <enabled>true</enabled>
-                               <updatePolicy>never</updatePolicy>
-                               <checksumPolicy>warn</checksumPolicy>
-                       </releases>
-                       <snapshots>
-                               <enabled>false</enabled>
-                       </snapshots>
-               </repository>
-       </repositories>
-       <reporting>
-               <plugins>
-                       <plugin>
-                               <artifactId>maven-project-info-reports-plugin</artifactId>
-                               <version>2.9</version>
-                               <reportSets>
-                                       <reportSet>
-                                               <reports>
-                                                       <report>index</report>
-                                                       <report>summary</report>
-                                                       <report>license</report>
-                                                       <report>scm</report>
-                                               </reports>
-                                       </reportSet>
-                               </reportSets>
-                       </plugin>
-                       <plugin>
-                               <artifactId>maven-javadoc-plugin</artifactId>
-                               <version>3.0.0</version>
-                               <configuration>
-                                       <failOnError>false</failOnError>
-                                       <additionalJOption>-Xdoclint:none</additionalJOption>
-                                       <excludePackageNames>*.internal.*,org.eclipse.*</excludePackageNames>
-                                       <encoding>UTF-8</encoding>
-                                       <detectLinks>true</detectLinks>
-                                       <links>
-                                               <link>http://docs.oracle.com/javase/8/docs/api</link>
-                                               <link>https://osgi.org/javadoc/r5/core</link>
-                                               <link>https://osgi.org/javadoc/r5/enterprise</link>
-                                               <link>https://docs.adobe.com/docs/en/spec/javax.jcr/javadocs/jcr-2.0</link>
-                                               <link>http://help.eclipse.org/oxygen/topic/org.eclipse.platform.doc.isv/reference/api</link>
-                                               <link>http://docs.spring.io/spring/docs/3.2.x/javadoc-api</link>
-                                       </links>
-                               </configuration>
-                               <reportSets>
-                                       <reportSet>
-                                               <id>aggregate-javadoc</id>
-                                               <inherited>false</inherited>
-                                               <reports>
-                                                       <report>aggregate</report>
-                                               </reports>
-                                       </reportSet>
-                                       <reportSet>
-                                               <id>javadoc</id>
-                                               <reports />
-                                       </reportSet>
-                               </reportSets>
-                       </plugin>
-                       <plugin>
-                               <artifactId>maven-jxr-plugin</artifactId>
-                               <version>2.5</version>
-                               <reportSets>
-                                       <reportSet>
-                                               <id>aggregate-jxr</id>
-                                               <inherited>false</inherited>
-                                               <reports>
-                                                       <report>aggregate</report>
-                                               </reports>
-                                       </reportSet>
-                                       <reportSet>
-                                               <id>jxr</id>
-                                               <reports />
-                                       </reportSet>
-                               </reportSets>
-                       </plugin>
-               </plugins>
-       </reporting>
-       <distributionManagement>
-               <repository>
-                       <id>staging</id>
-                       <url>dav:https://forge.argeo.org/data/java/argeo-2.3</url>
-                       <uniqueVersion>false</uniqueVersion>
-               </repository>
-               <site>
-                       <id>staging</id>
-                       <url>file:///srv/docfactory/argeo-2.1/site/argeo-suite/</url>
-               </site>
-       </distributionManagement>
-</project>
diff --git a/publishing/.gitignore b/publishing/.gitignore
deleted file mode 100644 (file)
index b83d222..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/publishing/org.argeo.publishing.ui/.classpath b/publishing/org.argeo.publishing.ui/.classpath
deleted file mode 100644 (file)
index e801ebf..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
-       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-       <classpathentry kind="src" path="src"/>
-       <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/publishing/org.argeo.publishing.ui/.gitignore b/publishing/org.argeo.publishing.ui/.gitignore
deleted file mode 100644 (file)
index 09e3bc9..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/bin/
-/target/
diff --git a/publishing/org.argeo.publishing.ui/.project b/publishing/org.argeo.publishing.ui/.project
deleted file mode 100644 (file)
index 5e90066..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-       <name>org.argeo.publishing.ui</name>
-       <comment></comment>
-       <projects>
-       </projects>
-       <buildSpec>
-               <buildCommand>
-                       <name>org.eclipse.jdt.core.javabuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ManifestBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.SchemaBuilder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-               <buildCommand>
-                       <name>org.eclipse.pde.ds.core.builder</name>
-                       <arguments>
-                       </arguments>
-               </buildCommand>
-       </buildSpec>
-       <natures>
-               <nature>org.eclipse.pde.PluginNature</nature>
-               <nature>org.eclipse.jdt.core.javanature</nature>
-       </natures>
-</projectDescription>
diff --git a/publishing/org.argeo.publishing.ui/META-INF/.gitignore b/publishing/org.argeo.publishing.ui/META-INF/.gitignore
deleted file mode 100644 (file)
index 4854a41..0000000
+++ /dev/null
@@ -1 +0,0 @@
-/MANIFEST.MF
diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml b/publishing/org.argeo.publishing.ui/OSGI-INF/dbkServlet.xml
deleted file mode 100644 (file)
index 05522d5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="DocBook Servlet">
-   <implementation class="org.argeo.publishing.servlet.DbkServlet"/>
-   <service>
-      <provide interface="javax.servlet.Servlet"/>
-   </service>
-   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/dbk/*"/>
-   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=htmlServletContext)"/>"/>
-   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
-   <reference bind="addTheme" cardinality="0..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
-</scr:component>
diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/documentUiProvider.xml b/publishing/org.argeo.publishing.ui/OSGI-INF/documentUiProvider.xml
deleted file mode 100644 (file)
index 5cee79f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-   <implementation class="org.argeo.publishing.ui.DocumentUiProvider"/>
-   <service>
-      <provide interface="org.argeo.cms.ui.CmsUiProvider"/>
-   </service>
-   <properties entry="config/documentUiProvider.properties"/>
-</scr:component>
diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/fontsServlet.xml b/publishing/org.argeo.publishing.ui/OSGI-INF/fontsServlet.xml
deleted file mode 100644 (file)
index 6ca1c41..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
-   <implementation class="org.argeo.publishing.servlet.FontsServlet"/>
-   <service>
-      <provide interface="javax.servlet.Servlet"/>
-   </service>
-   <property name="osgi.http.whiteboard.servlet.pattern" type="String" value="/fonts/*"/>
-   <property name="osgi.http.whiteboard.context.select" type="String" value="(osgi.http.whiteboard.context.name=default)"/>
-   <reference bind="addTheme" cardinality="0..n" interface="org.argeo.cms.ui.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
-</scr:component>
diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml b/publishing/org.argeo.publishing.ui/OSGI-INF/htmlServletContext.xml
deleted file mode 100644 (file)
index e0c1f6b..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
-   <implementation class="org.argeo.cms.servlet.CmsServletContext"/>
-   <service>
-      <provide interface="org.osgi.service.http.context.ServletContextHelper"/>
-   </service>
-   <property name="osgi.http.whiteboard.context.name" type="String" value="htmlServletContext"/>
-   <property name="osgi.http.whiteboard.context.path" type="String" value="/html"/>
-</scr:component>
diff --git a/publishing/org.argeo.publishing.ui/OSGI-INF/l10n/bundle.properties b/publishing/org.argeo.publishing.ui/OSGI-INF/l10n/bundle.properties
deleted file mode 100644 (file)
index 54f5ce8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-paragraph=paragraph
-section=section
-media=media
-style=style
-
-insertParagraph=insert paragraph
-deleteParagraph=delete paragraph
-deleteSection=delete section
-
-insertMedia=insert media
-deleteMedia=delete media
\ No newline at end of file
diff --git a/publishing/org.argeo.publishing.ui/bnd.bnd b/publishing/org.argeo.publishing.ui/bnd.bnd
deleted file mode 100644 (file)
index 9704732..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-Import-Package:\
-org.osgi.service.http.context,\
-javax.jcr.nodetype,\
-org.osgi.service.event,\
-org.argeo.suite.ui,\
-org.argeo.api,\
-org.eclipse.swt,\
-org.eclipse.jface.viewers,\
-org.osgi.framework,\
-org.apache.xml.serializer,\
-*
-
-Provide-Capability:\
-cms.datamodel; name=docbook; cnd=/org/argeo/docbook/docbook.cnd; abstract=true
-
-Service-Component:\
-OSGI-INF/fontsServlet.xml,\
-OSGI-INF/htmlServletContext.xml,\
-OSGI-INF/dbkServlet.xml,\
-OSGI-INF/documentUiProvider.xml
diff --git a/publishing/org.argeo.publishing.ui/build.properties b/publishing/org.argeo.publishing.ui/build.properties
deleted file mode 100644 (file)
index 2ef3d70..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/,\
-               OSGI-INF/documentUiProvider.xml
-source.. = src/
diff --git a/publishing/org.argeo.publishing.ui/config/documentUiProvider.properties b/publishing/org.argeo.publishing.ui/config/documentUiProvider.properties
deleted file mode 100644 (file)
index 855735d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-service.pid=argeo.publishing.ui.documentUiProvider
-
-entity.type=entity:document,nt:file
\ No newline at end of file
diff --git a/publishing/org.argeo.publishing.ui/pom.xml b/publishing/org.argeo.publishing.ui/pom.xml
deleted file mode 100644 (file)
index b70057c..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>publishing</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>org.argeo.publishing.ui</artifactId>
-       <name>Publishing UI</name>
-       <packaging>jar</packaging>
-       <dependencies>
-               <dependency>
-                       <groupId>org.argeo.suite</groupId>
-                       <artifactId>org.argeo.suite.ui</artifactId>
-                       <version>2.3.1-SNAPSHOT</version>
-               </dependency>
-
-               <!-- Eclipse E4 -->
-               <dependency>
-                       <groupId>org.argeo.tp</groupId>
-                       <artifactId>argeo-tp-rap-e4</artifactId>
-                       <version>${version.argeo-tp}</version>
-                       <type>pom</type>
-                       <scope>provided</scope>
-               </dependency>
-               <!-- Specific -->
-               <dependency>
-                       <groupId>org.argeo.commons</groupId>
-                       <artifactId>org.argeo.eclipse.ui.rap</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <scope>provided</scope>
-               </dependency>
-
-       </dependencies>
-</project>
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/AbstractTextViewer.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/AbstractTextViewer.java
deleted file mode 100644 (file)
index 74a9c81..0000000
+++ /dev/null
@@ -1,888 +0,0 @@
-package org.argeo.cms.text;
-
-import static javax.jcr.Property.JCR_TITLE;
-import static org.argeo.cms.ui.util.CmsUiUtils.fillWidth;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Observer;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsException;
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.CmsImageManager;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.AbstractPageViewer;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.viewers.NodePart;
-import org.argeo.cms.ui.viewers.PropertyPart;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.cms.ui.viewers.SectionPart;
-import org.argeo.cms.ui.widgets.EditableImage;
-import org.argeo.cms.ui.widgets.EditableText;
-import org.argeo.cms.ui.widgets.Img;
-import org.argeo.cms.ui.widgets.StyledControl;
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.rap.fileupload.FileDetails;
-import org.eclipse.rap.fileupload.FileUploadEvent;
-import org.eclipse.rap.fileupload.FileUploadHandler;
-import org.eclipse.rap.fileupload.FileUploadListener;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/** Base class for text viewers and editors. */
-@Deprecated
-public abstract class AbstractTextViewer extends AbstractPageViewer implements
-               CmsNames, KeyListener, Observer {
-       private static final long serialVersionUID = -2401274679492339668L;
-       private final static Log log = LogFactory.getLog(AbstractTextViewer.class);
-
-       private final Section mainSection;
-
-       private TextInterpreter textInterpreter = new TextInterpreterImpl();
-       private CmsImageManager imageManager = CmsUiUtils.getCmsView()
-                       .getImageManager();
-
-       private FileUploadListener fileUploadListener;
-       private TextContextMenu styledTools;
-
-       private final boolean flat;
-
-       protected AbstractTextViewer(Section parent, int style,
-                       CmsEditable cmsEditable) {
-               super(parent, style, cmsEditable);
-               flat = SWT.FLAT == (style & SWT.FLAT);
-
-               if (getCmsEditable().canEdit()) {
-                       fileUploadListener = new FUL();
-                       styledTools = new TextContextMenu(this, parent.getDisplay());
-               }
-               this.mainSection = parent;
-               initModelIfNeeded(mainSection.getNode());
-               // layout(this.mainSection);
-       }
-
-       @Override
-       public Control getControl() {
-               return mainSection;
-       }
-
-       protected void refresh(Control control) throws RepositoryException {
-               if (!(control instanceof Section))
-                       return;
-               Section section = (Section) control;
-               if (section instanceof TextSection) {
-                       CmsUiUtils.clear(section);
-                       Node node = section.getNode();
-                       TextSection textSection = (TextSection) section;
-                       if (node.hasProperty(Property.JCR_TITLE)) {
-                               if (section.getHeader() == null)
-                                       section.createHeader();
-                               if (node.hasProperty(Property.JCR_TITLE)) {
-                                       SectionTitle title = newSectionTitle(textSection, node);
-                                       title.setLayoutData(CmsUiUtils.fillWidth());
-                                       updateContent(title);
-                               }
-                       }
-
-                       for (NodeIterator ni = node.getNodes(CMS_P); ni.hasNext();) {
-                               Node child = ni.nextNode();
-                               final SectionPart sectionPart;
-                               if (child.isNodeType(CmsTypes.CMS_IMAGE)
-                                               || child.isNodeType(NodeType.NT_FILE)) {
-                                       sectionPart = newImg(textSection, child);
-                               } else if (child.isNodeType(CmsTypes.CMS_STYLED)) {
-                                       sectionPart = newParagraph(textSection, child);
-                               } else {
-                                       sectionPart = newSectionPart(textSection, child);
-                                       if (sectionPart == null)
-                                               throw new CmsException("Unsupported node " + child);
-                                       // TODO list node types in exception
-                               }
-                               if (sectionPart instanceof Control)
-                                       ((Control) sectionPart).setLayoutData(CmsUiUtils.fillWidth());
-                       }
-
-                       if (!flat)
-                               for (NodeIterator ni = section.getNode().getNodes(CMS_H); ni
-                                               .hasNext();) {
-                                       Node child = ni.nextNode();
-                                       if (child.isNodeType(CmsTypes.CMS_SECTION)) {
-                                               TextSection newSection = new TextSection(section,
-                                                               SWT.NONE, child);
-                                               newSection.setLayoutData(CmsUiUtils.fillWidth());
-                                               refresh(newSection);
-                                       }
-                               }
-               } else {
-                       for (Section s : section.getSubSections().values())
-                               refresh(s);
-               }
-               // section.layout();
-       }
-
-       /** To be overridden in order to provide additional SectionPart types */
-       protected SectionPart newSectionPart(TextSection textSection, Node node) {
-               return null;
-       }
-
-       // CRUD
-       protected Paragraph newParagraph(TextSection parent, Node node)
-                       throws RepositoryException {
-               Paragraph paragraph = new Paragraph(parent, parent.getStyle(), node);
-               updateContent(paragraph);
-               paragraph.setLayoutData(fillWidth());
-               paragraph.setMouseListener(getMouseListener());
-               return paragraph;
-       }
-
-       protected Img newImg(TextSection parent, Node node)
-                       throws RepositoryException {
-               Img img = new Img(parent, parent.getStyle(), node) {
-                       private static final long serialVersionUID = 1297900641952417540L;
-
-                       @Override
-                       protected void setContainerLayoutData(Composite composite) {
-                               composite.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER,
-                                               SWT.DEFAULT));
-                       }
-
-                       @Override
-                       protected void setControlLayoutData(Control control) {
-                               control.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER,
-                                               SWT.DEFAULT));
-                       }
-               };
-               img.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
-               updateContent(img);
-               img.setMouseListener(getMouseListener());
-               return img;
-       }
-
-       protected SectionTitle newSectionTitle(TextSection parent, Node node)
-                       throws RepositoryException {
-               SectionTitle title = new SectionTitle(parent.getHeader(),
-                               parent.getStyle(), node.getProperty(JCR_TITLE));
-               updateContent(title);
-               title.setMouseListener(getMouseListener());
-               return title;
-       }
-
-       protected SectionTitle prepareSectionTitle(Section newSection,
-                       String titleText) throws RepositoryException {
-               Node sectionNode = newSection.getNode();
-               if (!sectionNode.hasProperty(JCR_TITLE))
-                       sectionNode.setProperty(Property.JCR_TITLE, "");
-               getTextInterpreter().write(sectionNode.getProperty(Property.JCR_TITLE),
-                               titleText);
-               if (newSection.getHeader() == null)
-                       newSection.createHeader();
-               SectionTitle sectionTitle = newSectionTitle((TextSection) newSection,
-                               sectionNode);
-               return sectionTitle;
-       }
-
-       protected void updateContent(EditablePart part) throws RepositoryException {
-               if (part instanceof SectionPart) {
-                       SectionPart sectionPart = (SectionPart) part;
-                       Node partNode = sectionPart.getNode();
-
-                       if (part instanceof StyledControl
-                                       && (sectionPart.getSection() instanceof TextSection)) {
-                               TextSection section = (TextSection) sectionPart.getSection();
-                               StyledControl styledControl = (StyledControl) part;
-                               if (partNode.isNodeType(CmsTypes.CMS_STYLED)) {
-                                       String style = partNode.hasProperty(CMS_STYLE) ? partNode
-                                                       .getProperty(CMS_STYLE).getString() : section
-                                                       .getDefaultTextStyle();
-                                       styledControl.setStyle(style);
-                               }
-                       }
-                       // use control AFTER setting style, since it may have been reset
-
-                       if (part instanceof EditableText) {
-                               EditableText paragraph = (EditableText) part;
-                               if (paragraph == getEdited())
-                                       paragraph.setText(textInterpreter.read(partNode));
-                               else
-                                       paragraph.setText(textInterpreter.raw(partNode));
-                       } else if (part instanceof EditableImage) {
-                               EditableImage editableImage = (EditableImage) part;
-                               imageManager.load(partNode, part.getControl(),
-                                               editableImage.getPreferredImageSize());
-                       }
-               } else if (part instanceof SectionTitle) {
-                       SectionTitle title = (SectionTitle) part;
-                       title.setStyle(title.getSection().getTitleStyle());
-                       // use control AFTER setting style
-                       if (title == getEdited())
-                               title.setText(textInterpreter.read(title.getProperty()));
-                       else
-                               title.setText(textInterpreter.raw(title.getProperty()));
-               }
-       }
-
-       // OVERRIDDEN FROM PARENT VIEWER
-       @Override
-       protected void save(EditablePart part) throws RepositoryException {
-               if (part instanceof EditableText) {
-                       EditableText et = (EditableText) part;
-                       String text = ((Text) et.getControl()).getText();
-
-                       String[] lines = text.split("[\r\n]+");
-                       assert lines.length != 0;
-                       saveLine(part, lines[0]);
-                       if (lines.length > 1) {
-                               ArrayList<Control> toLayout = new ArrayList<Control>();
-                               if (part instanceof Paragraph) {
-                                       Paragraph currentParagraph = (Paragraph) et;
-                                       Section section = currentParagraph.getSection();
-                                       Node sectionNode = section.getNode();
-                                       Node currentParagraphN = currentParagraph.getNode();
-                                       for (int i = 1; i < lines.length; i++) {
-                                               Node newNode = sectionNode.addNode(CMS_P);
-                                               newNode.addMixin(CmsTypes.CMS_STYLED);
-                                               saveLine(newNode, lines[i]);
-                                               // second node was create as last, if it is not the next
-                                               // one, it
-                                               // means there are some in between and we can take the
-                                               // one at
-                                               // index+1 for the re-order
-                                               if (newNode.getIndex() > currentParagraphN.getIndex() + 1) {
-                                                       sectionNode.orderBefore(p(newNode.getIndex()),
-                                                                       p(currentParagraphN.getIndex() + 1));
-                                               }
-                                               Paragraph newParagraph = newParagraph(
-                                                               (TextSection) section, newNode);
-                                               newParagraph.moveBelow(currentParagraph);
-                                               toLayout.add(newParagraph);
-
-                                               currentParagraph = newParagraph;
-                                               currentParagraphN = newNode;
-                                       }
-                                       persistChanges(sectionNode);
-                               }
-                               // TODO or rather return the created paragarphs?
-                               layout(toLayout.toArray(new Control[toLayout.size()]));
-                       }
-               }
-       }
-
-       protected void saveLine(EditablePart part, String line) {
-               if (part instanceof NodePart) {
-                       saveLine(((NodePart) part).getNode(), line);
-               } else if (part instanceof PropertyPart) {
-                       saveLine(((PropertyPart) part).getProperty(), line);
-               } else {
-                       throw new CmsException("Unsupported part " + part);
-               }
-       }
-
-       protected void saveLine(Item item, String line) {
-               line = line.trim();
-               textInterpreter.write(item, line);
-       }
-
-       @Override
-       protected void prepare(EditablePart part, Object caretPosition) {
-               Control control = part.getControl();
-               if (control instanceof Text) {
-                       Text text = (Text) control;
-                       if (caretPosition != null)
-                               if (caretPosition instanceof Integer)
-                                       text.setSelection((Integer) caretPosition);
-                               else if (caretPosition instanceof Point) {
-                                       // TODO find a way to position the caret at the right place
-                               }
-                       text.setData(RWT.ACTIVE_KEYS, new String[] { "BACKSPACE", "ESC",
-                                       "TAB", "SHIFT+TAB", "ALT+ARROW_LEFT", "ALT+ARROW_RIGHT",
-                                       "ALT+ARROW_UP", "ALT+ARROW_DOWN", "RETURN", "CTRL+RETURN",
-                                       "ENTER", "DELETE" });
-                       text.setData(RWT.CANCEL_KEYS, new String[] { "RETURN",
-                                       "ALT+ARROW_LEFT", "ALT+ARROW_RIGHT" });
-                       text.addKeyListener(this);
-               } else if (part instanceof Img) {
-                       ((Img) part).setFileUploadListener(fileUploadListener);
-               }
-       }
-
-       // REQUIRED BY CONTEXT MENU
-       void setParagraphStyle(Paragraph paragraph, String style) {
-               try {
-                       Node paragraphNode = paragraph.getNode();
-                       paragraphNode.setProperty(CMS_STYLE, style);
-                       persistChanges(paragraphNode);
-                       updateContent(paragraph);
-                       layout(paragraph);
-               } catch (RepositoryException e1) {
-                       throw new CmsException("Cannot set style " + style + " on "
-                                       + paragraph, e1);
-               }
-       }
-
-       void deletePart(SectionPart paragraph) {
-               try {
-                       Node paragraphNode = paragraph.getNode();
-                       Section section = paragraph.getSection();
-                       Session session = paragraphNode.getSession();
-                       paragraphNode.remove();
-                       session.save();
-                       if (paragraph instanceof Control)
-                               ((Control) paragraph).dispose();
-                       layout(section);
-               } catch (RepositoryException e1) {
-                       throw new CmsException("Cannot delete " + paragraph, e1);
-               }
-       }
-
-       String getRawParagraphText(Paragraph paragraph) {
-               return textInterpreter.raw(paragraph.getNode());
-       }
-
-       // COMMANDS
-       protected void splitEdit() {
-               checkEdited();
-               try {
-                       if (getEdited() instanceof Paragraph) {
-                               Paragraph paragraph = (Paragraph) getEdited();
-                               Text text = (Text) paragraph.getControl();
-                               int caretPosition = text.getCaretPosition();
-                               String txt = text.getText();
-                               String first = txt.substring(0, caretPosition);
-                               String second = txt.substring(caretPosition);
-                               Node firstNode = paragraph.getNode();
-                               Node sectionNode = firstNode.getParent();
-                               firstNode.setProperty(CMS_CONTENT, first);
-                               Node secondNode = sectionNode.addNode(CMS_P);
-                               secondNode.addMixin(CmsTypes.CMS_STYLED);
-                               // second node was create as last, if it is not the next one, it
-                               // means there are some in between and we can take the one at
-                               // index+1 for the re-order
-                               if (secondNode.getIndex() > firstNode.getIndex() + 1) {
-                                       sectionNode.orderBefore(p(secondNode.getIndex()),
-                                                       p(firstNode.getIndex() + 1));
-                               }
-
-                               // if we die in between, at least we still have the whole text
-                               // in the first node
-                               try {
-                                       textInterpreter.write(secondNode, second);
-                                       textInterpreter.write(firstNode, first);
-                               } catch (Exception e) {
-                                       // so that no additional nodes are created:
-                                       JcrUtils.discardUnderlyingSessionQuietly(firstNode);
-                                       throw e;
-                               }
-
-                               persistChanges(firstNode);
-
-                               Paragraph secondParagraph = paragraphSplitted(paragraph,
-                                               secondNode);
-                               edit(secondParagraph, 0);
-                       } else if (getEdited() instanceof SectionTitle) {
-                               SectionTitle sectionTitle = (SectionTitle) getEdited();
-                               Text text = (Text) sectionTitle.getControl();
-                               String txt = text.getText();
-                               int caretPosition = text.getCaretPosition();
-                               Section section = sectionTitle.getSection();
-                               Node sectionNode = section.getNode();
-                               Node paragraphNode = sectionNode.addNode(CMS_P);
-                               paragraphNode.addMixin(CmsTypes.CMS_STYLED);
-                               textInterpreter.write(paragraphNode,
-                                               txt.substring(caretPosition));
-                               textInterpreter.write(
-                                               sectionNode.getProperty(Property.JCR_TITLE),
-                                               txt.substring(0, caretPosition));
-                               sectionNode.orderBefore(p(paragraphNode.getIndex()), p(1));
-                               persistChanges(sectionNode);
-
-                               Paragraph paragraph = sectionTitleSplitted(sectionTitle,
-                                               paragraphNode);
-                               // section.layout();
-                               edit(paragraph, 0);
-                       }
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot split " + getEdited(), e);
-               }
-       }
-
-       protected void mergeWithPrevious() {
-               checkEdited();
-               try {
-                       Paragraph paragraph = (Paragraph) getEdited();
-                       Text text = (Text) paragraph.getControl();
-                       String txt = text.getText();
-                       Node paragraphNode = paragraph.getNode();
-                       if (paragraphNode.getIndex() == 1)
-                               return;// do nothing
-                       Node sectionNode = paragraphNode.getParent();
-                       Node previousNode = sectionNode
-                                       .getNode(p(paragraphNode.getIndex() - 1));
-                       String previousTxt = textInterpreter.read(previousNode);
-                       textInterpreter.write(previousNode, previousTxt + txt);
-                       paragraphNode.remove();
-                       persistChanges(sectionNode);
-
-                       Paragraph previousParagraph = paragraphMergedWithPrevious(
-                                       paragraph, previousNode);
-                       edit(previousParagraph, previousTxt.length());
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot stop editing", e);
-               }
-       }
-
-       protected void mergeWithNext() {
-               checkEdited();
-               try {
-                       Paragraph paragraph = (Paragraph) getEdited();
-                       Text text = (Text) paragraph.getControl();
-                       String txt = text.getText();
-                       Node paragraphNode = paragraph.getNode();
-                       Node sectionNode = paragraphNode.getParent();
-                       NodeIterator paragraphNodes = sectionNode.getNodes(CMS_P);
-                       long size = paragraphNodes.getSize();
-                       if (paragraphNode.getIndex() == size)
-                               return;// do nothing
-                       Node nextNode = sectionNode
-                                       .getNode(p(paragraphNode.getIndex() + 1));
-                       String nextTxt = textInterpreter.read(nextNode);
-                       textInterpreter.write(paragraphNode, txt + nextTxt);
-
-                       Section section = paragraph.getSection();
-                       Paragraph removed = (Paragraph) section.getSectionPart(nextNode
-                                       .getIdentifier());
-
-                       nextNode.remove();
-                       persistChanges(sectionNode);
-
-                       paragraphMergedWithNext(paragraph, removed);
-                       edit(paragraph, txt.length());
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot stop editing", e);
-               }
-       }
-
-       protected synchronized void upload(EditablePart part) {
-               try {
-                       if (part instanceof SectionPart) {
-                               SectionPart sectionPart = (SectionPart) part;
-                               Node partNode = sectionPart.getNode();
-                               int partIndex = partNode.getIndex();
-                               Section section = sectionPart.getSection();
-                               Node sectionNode = section.getNode();
-
-                               if (part instanceof Paragraph) {
-                                       Node newNode = sectionNode.addNode(CMS_P, NodeType.NT_FILE);
-                                       newNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE);
-                                       JcrUtils.copyBytesAsFile(sectionNode,
-                                                       p(newNode.getIndex()), new byte[0]);
-                                       if (partIndex < newNode.getIndex() - 1) {
-                                               // was not last
-                                               sectionNode.orderBefore(p(newNode.getIndex()),
-                                                               p(partIndex - 1));
-                                       }
-                                       // sectionNode.orderBefore(p(partNode.getIndex()),
-                                       // p(newNode.getIndex()));
-                                       persistChanges(sectionNode);
-                                       Img img = newImg((TextSection) section, newNode);
-                                       edit(img, null);
-                                       layout(img.getControl());
-                               } else if (part instanceof Img) {
-                                       if (getEdited() == part)
-                                               return;
-                                       edit(part, null);
-                                       layout(part.getControl());
-                               }
-                       }
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot upload", e);
-               }
-       }
-
-       protected void deepen() {
-               if (flat)
-                       return;
-               checkEdited();
-               try {
-                       if (getEdited() instanceof Paragraph) {
-                               Paragraph paragraph = (Paragraph) getEdited();
-                               Text text = (Text) paragraph.getControl();
-                               String txt = text.getText();
-                               Node paragraphNode = paragraph.getNode();
-                               Section section = paragraph.getSection();
-                               Node sectionNode = section.getNode();
-                               // main title
-                               if (section == mainSection && section instanceof TextSection
-                                               && paragraphNode.getIndex() == 1
-                                               && !sectionNode.hasProperty(JCR_TITLE)) {
-                                       SectionTitle sectionTitle = prepareSectionTitle(section,
-                                                       txt);
-                                       edit(sectionTitle, 0);
-                                       return;
-                               }
-                               Node newSectionNode = sectionNode.addNode(CMS_H,
-                                               CmsTypes.CMS_SECTION);
-                               sectionNode.orderBefore(h(newSectionNode.getIndex()), h(1));
-
-                               int paragraphIndex = paragraphNode.getIndex();
-                               String sectionPath = sectionNode.getPath();
-                               String newSectionPath = newSectionNode.getPath();
-                               while (sectionNode.hasNode(p(paragraphIndex + 1))) {
-                                       Node parag = sectionNode.getNode(p(paragraphIndex + 1));
-                                       sectionNode.getSession().move(
-                                                       sectionPath + '/' + p(paragraphIndex + 1),
-                                                       newSectionPath + '/' + CMS_P);
-                                       SectionPart sp = section.getSectionPart(parag
-                                                       .getIdentifier());
-                                       if (sp instanceof Control)
-                                               ((Control) sp).dispose();
-                               }
-                               // create property
-                               newSectionNode.setProperty(Property.JCR_TITLE, "");
-                               getTextInterpreter().write(
-                                               newSectionNode.getProperty(Property.JCR_TITLE), txt);
-
-                               TextSection newSection = new TextSection(section,
-                                               section.getStyle(), newSectionNode);
-                               newSection.setLayoutData(CmsUiUtils.fillWidth());
-                               newSection.moveBelow(paragraph);
-
-                               // dispose
-                               paragraphNode.remove();
-                               paragraph.dispose();
-
-                               refresh(newSection);
-                               newSection.getParent().layout();
-                               layout(newSection);
-                               persistChanges(sectionNode);
-                       } else if (getEdited() instanceof SectionTitle) {
-                               SectionTitle sectionTitle = (SectionTitle) getEdited();
-                               Section section = sectionTitle.getSection();
-                               Section parentSection = section.getParentSection();
-                               if (parentSection == null)
-                                       return;// cannot deepen main section
-                               Node sectionN = section.getNode();
-                               Node parentSectionN = parentSection.getNode();
-                               if (sectionN.getIndex() == 1)
-                                       return;// cannot deepen first section
-                               Node previousSectionN = parentSectionN.getNode(h(sectionN
-                                               .getIndex() - 1));
-                               NodeIterator subSections = previousSectionN.getNodes(CMS_H);
-                               int subsectionsCount = (int) subSections.getSize();
-                               previousSectionN.getSession().move(
-                                               sectionN.getPath(),
-                                               previousSectionN.getPath() + "/"
-                                                               + h(subsectionsCount + 1));
-                               section.dispose();
-                               TextSection newSection = new TextSection(section,
-                                               section.getStyle(), sectionN);
-                               refresh(newSection);
-                               persistChanges(previousSectionN);
-                       }
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot deepen " + getEdited(), e);
-               }
-       }
-
-       protected void undeepen() {
-               if (flat)
-                       return;
-               checkEdited();
-               try {
-                       if (getEdited() instanceof Paragraph) {
-                               upload(getEdited());
-                       } else if (getEdited() instanceof SectionTitle) {
-                               SectionTitle sectionTitle = (SectionTitle) getEdited();
-                               Section section = sectionTitle.getSection();
-                               Node sectionNode = section.getNode();
-                               Section parentSection = section.getParentSection();
-                               if (parentSection == null)
-                                       return;// cannot undeepen main section
-
-                               // choose in which section to merge
-                               Section mergedSection;
-                               if (sectionNode.getIndex() == 1)
-                                       mergedSection = section.getParentSection();
-                               else {
-                                       Map<String, Section> parentSubsections = parentSection
-                                                       .getSubSections();
-                                       ArrayList<Section> lst = new ArrayList<Section>(
-                                                       parentSubsections.values());
-                                       mergedSection = lst.get(sectionNode.getIndex() - 1);
-                               }
-                               Node mergedNode = mergedSection.getNode();
-                               boolean mergedHasSubSections = mergedNode.hasNode(CMS_H);
-
-                               // title as paragraph
-                               Node newParagrapheNode = mergedNode.addNode(CMS_P);
-                               newParagrapheNode.addMixin(CmsTypes.CMS_STYLED);
-                               if (mergedHasSubSections)
-                                       mergedNode.orderBefore(p(newParagrapheNode.getIndex()),
-                                                       h(1));
-                               String txt = getTextInterpreter().read(
-                                               sectionNode.getProperty(Property.JCR_TITLE));
-                               getTextInterpreter().write(newParagrapheNode, txt);
-                               // move
-                               NodeIterator paragraphs = sectionNode.getNodes(CMS_P);
-                               while (paragraphs.hasNext()) {
-                                       Node p = paragraphs.nextNode();
-                                       SectionPart sp = section.getSectionPart(p.getIdentifier());
-                                       if (sp instanceof Control)
-                                               ((Control) sp).dispose();
-                                       mergedNode.getSession().move(p.getPath(),
-                                                       mergedNode.getPath() + '/' + CMS_P);
-                                       if (mergedHasSubSections)
-                                               mergedNode.orderBefore(p(p.getIndex()), h(1));
-                               }
-
-                               Iterator<Section> subsections = section.getSubSections()
-                                               .values().iterator();
-                               // NodeIterator sections = sectionNode.getNodes(CMS_H);
-                               while (subsections.hasNext()) {
-                                       Section subsection = subsections.next();
-                                       Node s = subsection.getNode();
-                                       mergedNode.getSession().move(s.getPath(),
-                                                       mergedNode.getPath() + '/' + CMS_H);
-                                       subsection.dispose();
-                               }
-
-                               // remove section
-                               section.getNode().remove();
-                               section.dispose();
-
-                               refresh(mergedSection);
-                               mergedSection.getParent().layout();
-                               layout(mergedSection);
-                               persistChanges(mergedNode);
-                       }
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot undeepen " + getEdited(), e);
-               }
-       }
-
-       // UI CHANGES
-       protected Paragraph paragraphSplitted(Paragraph paragraph, Node newNode)
-                       throws RepositoryException {
-               Section section = paragraph.getSection();
-               updateContent(paragraph);
-               Paragraph newParagraph = newParagraph((TextSection) section, newNode);
-               newParagraph.setLayoutData(CmsUiUtils.fillWidth());
-               newParagraph.moveBelow(paragraph);
-               layout(paragraph.getControl(), newParagraph.getControl());
-               return newParagraph;
-       }
-
-       protected Paragraph sectionTitleSplitted(SectionTitle sectionTitle,
-                       Node newNode) throws RepositoryException {
-               updateContent(sectionTitle);
-               Paragraph newParagraph = newParagraph(sectionTitle.getSection(),
-                               newNode);
-               // we assume beforeFirst is not null since there was a sectionTitle
-               newParagraph.moveBelow(sectionTitle.getSection().getHeader());
-               layout(sectionTitle.getControl(), newParagraph.getControl());
-               return newParagraph;
-       }
-
-       protected Paragraph paragraphMergedWithPrevious(Paragraph removed,
-                       Node remaining) throws RepositoryException {
-               Section section = removed.getSection();
-               removed.dispose();
-
-               Paragraph paragraph = (Paragraph) section.getSectionPart(remaining
-                               .getIdentifier());
-               updateContent(paragraph);
-               layout(paragraph.getControl());
-               return paragraph;
-       }
-
-       protected void paragraphMergedWithNext(Paragraph remaining,
-                       Paragraph removed) throws RepositoryException {
-               removed.dispose();
-               updateContent(remaining);
-               layout(remaining.getControl());
-       }
-
-       // UTILITIES
-       protected String p(Integer index) {
-               StringBuilder sb = new StringBuilder(6);
-               sb.append(CMS_P).append('[').append(index).append(']');
-               return sb.toString();
-       }
-
-       protected String h(Integer index) {
-               StringBuilder sb = new StringBuilder(5);
-               sb.append(CMS_H).append('[').append(index).append(']');
-               return sb.toString();
-       }
-
-       // GETTERS / SETTERS
-       public Section getMainSection() {
-               return mainSection;
-       }
-
-       public boolean isFlat() {
-               return flat;
-       }
-
-       public TextInterpreter getTextInterpreter() {
-               return textInterpreter;
-       }
-
-       // KEY LISTENER
-       @Override
-       public void keyPressed(KeyEvent ke) {
-               if (log.isTraceEnabled())
-                       log.trace(ke);
-
-               if (getEdited() == null)
-                       return;
-               boolean altPressed = (ke.stateMask & SWT.ALT) != 0;
-               boolean shiftPressed = (ke.stateMask & SWT.SHIFT) != 0;
-               boolean ctrlPressed = (ke.stateMask & SWT.CTRL) != 0;
-
-               try {
-                       // Common
-                       if (ke.keyCode == SWT.ESC) {
-                               cancelEdit();
-                       } else if (ke.character == '\r') {
-                               splitEdit();
-                       } else if (ke.character == 'S') {
-                               if (ctrlPressed)
-                                       saveEdit();
-                       } else if (ke.character == '\t') {
-                               if (!shiftPressed) {
-                                       deepen();
-                               } else if (shiftPressed) {
-                                       undeepen();
-                               }
-                       } else {
-                               if (getEdited() instanceof Paragraph) {
-                                       Paragraph paragraph = (Paragraph) getEdited();
-                                       Section section = paragraph.getSection();
-                                       if (altPressed && ke.keyCode == SWT.ARROW_RIGHT) {
-                                               edit(section.nextSectionPart(paragraph), 0);
-                                       } else if (altPressed && ke.keyCode == SWT.ARROW_LEFT) {
-                                               edit(section.previousSectionPart(paragraph), 0);
-                                       } else if (ke.character == SWT.BS) {
-                                               Text text = (Text) paragraph.getControl();
-                                               int caretPosition = text.getCaretPosition();
-                                               if (caretPosition == 0) {
-                                                       mergeWithPrevious();
-                                               }
-                                       } else if (ke.character == SWT.DEL) {
-                                               Text text = (Text) paragraph.getControl();
-                                               int caretPosition = text.getCaretPosition();
-                                               int charcount = text.getCharCount();
-                                               if (caretPosition == charcount) {
-                                                       mergeWithNext();
-                                               }
-                                       }
-                               }
-                       }
-               } catch (Exception e) {
-                       ke.doit = false;
-                       notifyEditionException(e);
-               }
-       }
-
-       @Override
-       public void keyReleased(KeyEvent e) {
-       }
-
-       // MOUSE LISTENER
-       @Override
-       protected MouseListener createMouseListener() {
-               return new ML();
-       }
-
-       private class ML extends MouseAdapter {
-               private static final long serialVersionUID = 8526890859876770905L;
-
-               @Override
-               public void mouseDoubleClick(MouseEvent e) {
-                       if (e.button == 1) {
-                               Control source = (Control) e.getSource();
-                               if (getCmsEditable().canEdit()) {
-                                       if (getCmsEditable().isEditing()
-                                                       && !(getEdited() instanceof Img)) {
-                                               if (source == mainSection)
-                                                       return;
-                                               EditablePart part = findDataParent(source);
-                                               upload(part);
-                                       } else {
-                                               getCmsEditable().startEditing();
-                                       }
-                               }
-                       }
-               }
-
-               @Override
-               public void mouseDown(MouseEvent e) {
-                       if (getCmsEditable().isEditing()) {
-                               if (e.button == 1) {
-                                       Control source = (Control) e.getSource();
-                                       EditablePart composite = findDataParent(source);
-                                       Point point = new Point(e.x, e.y);
-                                       if (!(composite instanceof Img))
-                                               edit(composite, source.toDisplay(point));
-                               } else if (e.button == 3) {
-                                       EditablePart composite = findDataParent((Control) e
-                                                       .getSource());
-                                       if (styledTools != null)
-                                               styledTools.show(composite, new Point(e.x, e.y));
-                               }
-                       }
-               }
-
-               @Override
-               public void mouseUp(MouseEvent e) {
-               }
-       }
-
-       // FILE UPLOAD LISTENER
-       private class FUL implements FileUploadListener {
-               public void uploadProgress(FileUploadEvent event) {
-                       // TODO Monitor upload progress
-               }
-
-               public void uploadFailed(FileUploadEvent event) {
-                       throw new CmsException("Upload failed " + event,
-                                       event.getException());
-               }
-
-               public void uploadFinished(FileUploadEvent event) {
-                       for (FileDetails file : event.getFileDetails()) {
-                               if (log.isDebugEnabled())
-                                       log.debug("Received: " + file.getFileName());
-                       }
-                       mainSection.getDisplay().syncExec(new Runnable() {
-                               @Override
-                               public void run() {
-                                       saveEdit();
-                               }
-                       });
-                       FileUploadHandler uploadHandler = (FileUploadHandler) event
-                                       .getSource();
-                       uploadHandler.dispose();
-               }
-       }
-}
\ No newline at end of file
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsNames.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsNames.java
deleted file mode 100644 (file)
index 1fb2988..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.argeo.cms.text;
-
-/** JCR names. */
-public interface CmsNames {
-       /*
-        * TEXT
-        */
-       public final static String CMS_DRAFTS = "cms:drafts";
-
-       public final static String CMS_P = "cms:p";
-       public final static String CMS_H = "cms:h";
-
-       public final static String CMS_CONTENT = "cms:content";
-       public final static String CMS_STYLE = "cms:style";
-
-       public final static String CMS_INDEX = "cms:index";
-
-       /*
-        * IMAGES
-        */
-       public final static String CMS_IMAGE_WIDTH = "cms:imageWidth";
-       public final static String CMS_IMAGE_HEIGHT = "cms:imageHeight";
-       public final static String CMS_DATA = "cms:data";
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsTextImageManager.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsTextImageManager.java
deleted file mode 100644 (file)
index 865c2ce..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.argeo.cms.text;
-
-import java.io.IOException;
-
-import javax.jcr.Binary;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.util.DefaultImageManager;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-
-/** Manages only public images so far. */
-public class CmsTextImageManager extends DefaultImageManager {
-       @Override
-       public Point getImageSize(Node node) throws RepositoryException {
-               return new Point(
-                               node.hasProperty(CmsNames.CMS_IMAGE_WIDTH) ? (int) node.getProperty(CmsNames.CMS_IMAGE_WIDTH).getLong()
-                                               : 0,
-                               node.hasProperty(CmsNames.CMS_IMAGE_HEIGHT)
-                                               ? (int) node.getProperty(CmsNames.CMS_IMAGE_HEIGHT).getLong()
-                                               : 0);
-       }
-
-       @Override
-       public Binary getImageBinary(Node node) throws RepositoryException {
-               Binary res = super.getImageBinary(node);
-               if (res == null && node.isNodeType(CmsTypes.CMS_STYLED) && node.hasProperty(CmsNames.CMS_DATA)) {
-                       return node.getProperty(CmsNames.CMS_DATA).getBinary();
-               } else {
-                       return null;
-               }
-       }
-
-       @Override
-       protected void processNewImageFile(Node context,
-                       Node fileNode, ImageData id)
-                       throws RepositoryException, IOException {
-               fileNode.addMixin(CmsTypes.CMS_IMAGE);
-               fileNode.setProperty(CmsNames.CMS_IMAGE_WIDTH, id.width);
-               fileNode.setProperty(CmsNames.CMS_IMAGE_HEIGHT, id.height);
-
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsTypes.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CmsTypes.java
deleted file mode 100644 (file)
index 3d856fd..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.argeo.cms.text;
-
-/** JCR types. */
-public interface CmsTypes {
-       public final static String CMS_TEXT = "cms:text";
-       public final static String CMS_IMAGE = "cms:image";
-       public final static String CMS_SECTION = "cms:section";
-       public final static String CMS_STYLED = "cms:styled";
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CustomTextEditor.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/CustomTextEditor.java
deleted file mode 100644 (file)
index c7690c7..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.argeo.cms.text;
-
-import static org.argeo.cms.ui.util.CmsUiUtils.fillWidth;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.viewers.Section;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Manages hardcoded sections as an arbitrary hierarchy under the main section,
- * which contains no text and no title.
- */
-@Deprecated
-public class CustomTextEditor extends AbstractTextViewer {
-       private static final long serialVersionUID = 5277789504209413500L;
-
-       public CustomTextEditor(Composite parent, int style, Node textNode,
-                       CmsEditable cmsEditable) throws RepositoryException {
-               this(new Section(parent, style, textNode), style, cmsEditable);
-       }
-
-       public CustomTextEditor(Section mainSection, int style,
-                       CmsEditable cmsEditable) throws RepositoryException {
-               super(mainSection, style, cmsEditable);
-               mainSection.setLayoutData(fillWidth());
-       }
-
-       @Override
-       public Section getMainSection() {
-               return super.getMainSection();
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/IdentityTextInterpreter.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/IdentityTextInterpreter.java
deleted file mode 100644 (file)
index ce59ed6..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.argeo.cms.text;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsException;
-
-/** Based on HTML with a few Wiki-like shortcuts. */
-public class IdentityTextInterpreter implements TextInterpreter, CmsNames {
-
-       @Override
-       public void write(Item item, String content) {
-               try {
-                       if (item instanceof Node) {
-                               Node node = (Node) item;
-                               if (node.isNodeType(CmsTypes.CMS_STYLED)) {
-                                       String raw = convertToStorage(node, content);
-                                       validateBeforeStoring(raw);
-                                       node.setProperty(CMS_CONTENT, raw);
-                               } else {
-                                       throw new CmsException("Don't know how to interpret " + node);
-                               }
-                       } else {// property
-                               Property property = (Property) item;
-                               property.setValue(content);
-                       }
-                       // item.getSession().save();
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot set content on " + item, e);
-               }
-       }
-
-       @Override
-       public String readSimpleHtml(Item item) {
-               return raw(item);
-       }
-
-       @Override
-       public String read(Item item) {
-               try {
-                       String raw = raw(item);
-                       return convertFromStorage(item, raw);
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot get " + item + " for edit", e);
-               }
-       }
-
-       @Override
-       public String raw(Item item) {
-               try {
-                       item.getSession().refresh(true);
-                       if (item instanceof Node) {
-                               Node node = (Node) item;
-                               if (node.isNodeType(CmsTypes.CMS_STYLED)) {
-                                       // WORKAROUND FOR BROKEN PARARAPHS
-                                       if (!node.hasProperty(CMS_CONTENT)) {
-                                               node.setProperty(CMS_CONTENT, "");
-                                               node.getSession().save();
-                                       }
-
-                                       return node.getProperty(CMS_CONTENT).getString();
-                               } else {
-                                       throw new CmsException("Don't know how to interpret " + node);
-                               }
-                       } else {// property
-                               Property property = (Property) item;
-                               return property.getString();
-                       }
-               } catch (RepositoryException e) {
-                       throw new CmsException("Cannot get " + item + " content", e);
-               }
-       }
-
-       // EXTENSIBILITY
-       /**
-        * To be overridden, in order to make sure that only valid strings are being
-        * stored.
-        */
-       protected void validateBeforeStoring(String raw) {
-       }
-
-       /** To be overridden, in order to support additional formatting. */
-       protected String convertToStorage(Item item, String content) throws RepositoryException {
-               return content;
-
-       }
-
-       /** To be overridden, in order to support additional formatting. */
-       protected String convertFromStorage(Item item, String content) throws RepositoryException {
-               return content;
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/MarkupValidatorCopy.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/MarkupValidatorCopy.java
deleted file mode 100644 (file)
index 1aee5d9..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.argeo.cms.text;
-
-import java.io.StringReader;
-import java.text.MessageFormat;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.eclipse.rap.rwt.SingletonUtil;
-import org.eclipse.swt.widgets.Widget;
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Copy of RAP v2.3 since it is in an internal package.
- */
-class MarkupValidatorCopy {
-
-       // Used by Eclipse Scout project
-       public static final String MARKUP_VALIDATION_DISABLED = "org.eclipse.rap.rwt.markupValidationDisabled";
-
-       private static final String DTD = createDTD();
-       private static final Map<String, String[]> SUPPORTED_ELEMENTS = createSupportedElementsMap();
-       private final SAXParser saxParser;
-
-       public static MarkupValidatorCopy getInstance() {
-               return SingletonUtil.getSessionInstance(MarkupValidatorCopy.class);
-       }
-
-       public MarkupValidatorCopy() {
-               saxParser = createSAXParser();
-       }
-
-       public void validate(String text) {
-               StringBuilder markup = new StringBuilder();
-               markup.append(DTD);
-               markup.append("<html>");
-               markup.append(text);
-               markup.append("</html>");
-               InputSource inputSource = new InputSource(new StringReader(markup.toString()));
-               try {
-                       saxParser.parse(inputSource, new MarkupHandler());
-               } catch (RuntimeException exception) {
-                       throw exception;
-               } catch (Exception exception) {
-                       throw new IllegalArgumentException("Failed to parse markup text", exception);
-               }
-       }
-
-       public static boolean isValidationDisabledFor(Widget widget) {
-               return Boolean.TRUE.equals(widget.getData(MARKUP_VALIDATION_DISABLED));
-       }
-
-       private static SAXParser createSAXParser() {
-               SAXParser result = null;
-               SAXParserFactory parserFactory = SAXParserFactory.newInstance();
-               try {
-                       result = parserFactory.newSAXParser();
-               } catch (Exception exception) {
-                       throw new RuntimeException("Failed to create SAX parser", exception);
-               }
-               return result;
-       }
-
-       private static String createDTD() {
-               StringBuilder result = new StringBuilder();
-               result.append("<!DOCTYPE html [");
-               result.append("<!ENTITY quot \"&#34;\">");
-               result.append("<!ENTITY amp \"&#38;\">");
-               result.append("<!ENTITY apos \"&#39;\">");
-               result.append("<!ENTITY lt \"&#60;\">");
-               result.append("<!ENTITY gt \"&#62;\">");
-               result.append("<!ENTITY nbsp \"&#160;\">");
-               result.append("<!ENTITY ensp \"&#8194;\">");
-               result.append("<!ENTITY emsp \"&#8195;\">");
-               result.append("<!ENTITY ndash \"&#8211;\">");
-               result.append("<!ENTITY mdash \"&#8212;\">");
-               result.append("]>");
-               return result.toString();
-       }
-
-       private static Map<String, String[]> createSupportedElementsMap() {
-               Map<String, String[]> result = new HashMap<String, String[]>();
-               result.put("html", new String[0]);
-               result.put("br", new String[0]);
-               result.put("b", new String[] { "style" });
-               result.put("strong", new String[] { "style" });
-               result.put("i", new String[] { "style" });
-               result.put("em", new String[] { "style" });
-               result.put("sub", new String[] { "style" });
-               result.put("sup", new String[] { "style" });
-               result.put("big", new String[] { "style" });
-               result.put("small", new String[] { "style" });
-               result.put("del", new String[] { "style" });
-               result.put("ins", new String[] { "style" });
-               result.put("code", new String[] { "style" });
-               result.put("samp", new String[] { "style" });
-               result.put("kbd", new String[] { "style" });
-               result.put("var", new String[] { "style" });
-               result.put("cite", new String[] { "style" });
-               result.put("dfn", new String[] { "style" });
-               result.put("q", new String[] { "style" });
-               result.put("abbr", new String[] { "style", "title" });
-               result.put("span", new String[] { "style" });
-               result.put("img", new String[] { "style", "src", "width", "height", "title", "alt" });
-               result.put("a", new String[] { "style", "href", "target", "title" });
-               return result;
-       }
-
-       private static class MarkupHandler extends DefaultHandler {
-
-               @Override
-               public void startElement(String uri, String localName, String name, Attributes attributes) {
-                       checkSupportedElements(name, attributes);
-                       checkSupportedAttributes(name, attributes);
-                       checkMandatoryAttributes(name, attributes);
-               }
-
-               private static void checkSupportedElements(String elementName, Attributes attributes) {
-                       if (!SUPPORTED_ELEMENTS.containsKey(elementName)) {
-                               throw new IllegalArgumentException("Unsupported element in markup text: " + elementName);
-                       }
-               }
-
-               private static void checkSupportedAttributes(String elementName, Attributes attributes) {
-                       if (attributes.getLength() > 0) {
-                               List<String> supportedAttributes = Arrays.asList(SUPPORTED_ELEMENTS.get(elementName));
-                               int index = 0;
-                               String attributeName = attributes.getQName(index);
-                               while (attributeName != null) {
-                                       if (!supportedAttributes.contains(attributeName)) {
-                                               String message = "Unsupported attribute \"{0}\" for element \"{1}\" in markup text";
-                                               message = MessageFormat.format(message, new Object[] { attributeName, elementName });
-                                               throw new IllegalArgumentException(message);
-                                       }
-                                       index++;
-                                       attributeName = attributes.getQName(index);
-                               }
-                       }
-               }
-
-               private static void checkMandatoryAttributes(String elementName, Attributes attributes) {
-                       checkIntAttribute(elementName, attributes, "img", "width");
-                       checkIntAttribute(elementName, attributes, "img", "height");
-               }
-
-               private static void checkIntAttribute(String elementName, Attributes attributes, String checkedElementName,
-                               String checkedAttributeName) {
-                       if (checkedElementName.equals(elementName)) {
-                               String attribute = attributes.getValue(checkedAttributeName);
-                               try {
-                                       Integer.parseInt(attribute);
-                               } catch (NumberFormatException exception) {
-                                       String message = "Mandatory attribute \"{0}\" for element \"{1}\" is missing or not a valid integer";
-                                       Object[] arguments = new Object[] { checkedAttributeName, checkedElementName };
-                                       message = MessageFormat.format(message, arguments);
-                                       throw new IllegalArgumentException(message);
-                               }
-                       }
-               }
-
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/Paragraph.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/Paragraph.java
deleted file mode 100644 (file)
index cfd0272..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.argeo.cms.text;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.SectionPart;
-import org.argeo.cms.ui.widgets.EditableText;
-import org.argeo.cms.ui.widgets.TextStyles;
-
-/** An editable paragraph. */
-public class Paragraph extends EditableText implements SectionPart {
-       private static final long serialVersionUID = 3746457776229542887L;
-
-       private final TextSection section;
-
-       public Paragraph(TextSection section, int style, Node node) throws RepositoryException {
-               super(section, style, node);
-               this.section = section;
-               CmsUiUtils.style(this, TextStyles.TEXT_PARAGRAPH);
-       }
-
-       public TextSection getSection() {
-               return section;
-       }
-
-       @Override
-       public String getPartId() {
-               return getNodeId();
-       }
-
-       @Override
-       public Node getItem() throws RepositoryException {
-               return getNode();
-       }
-
-       @Override
-       public String toString() {
-               return "Paragraph #" + getPartId();
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/SectionTitle.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/SectionTitle.java
deleted file mode 100644 (file)
index 1a67c11..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.argeo.cms.text;
-
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.viewers.PropertyPart;
-import org.argeo.cms.ui.widgets.EditableText;
-import org.eclipse.swt.widgets.Composite;
-
-/** The title of a section. */
-@Deprecated
-public class SectionTitle extends EditableText implements EditablePart,
-               PropertyPart {
-       private static final long serialVersionUID = -1787983154946583171L;
-
-       private final TextSection section;
-
-       public SectionTitle(Composite parent, int swtStyle, Property title)
-                       throws RepositoryException {
-               super(parent, swtStyle, title);
-               section = (TextSection) TextSection.findSection(this);
-       }
-
-       public TextSection getSection() {
-               return section;
-       }
-
-       // @Override
-       // public Property getProperty() throws RepositoryException {
-       // return getSection().getNode().getProperty(Property.JCR_TITLE);
-       // }
-
-       @Override
-       public Property getItem() throws RepositoryException {
-               return getProperty();
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/StandardTextEditor.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/StandardTextEditor.java
deleted file mode 100644 (file)
index 3c3d16b..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.argeo.cms.text;
-
-import static javax.jcr.Property.JCR_TITLE;
-
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.Section;
-import org.eclipse.swt.widgets.Composite;
-
-/** Text editor where sections and subsections can be managed by the user. */
-@Deprecated
-public class StandardTextEditor extends AbstractTextViewer {
-       private static final long serialVersionUID = 6049661610883342325L;
-
-       public StandardTextEditor(Composite parent, int style, Node textNode,
-                       CmsEditable cmsEditable) throws RepositoryException {
-               super(new TextSection(parent, style, textNode), style, cmsEditable);
-               refresh();
-               getMainSection().setLayoutData(CmsUiUtils.fillWidth());
-       }
-
-       @Override
-       protected void initModel(Node textNode) throws RepositoryException {
-               if (isFlat())
-                       textNode.addNode(CMS_P).addMixin(CmsTypes.CMS_STYLED);
-               else
-                       textNode.setProperty(JCR_TITLE, textNode.getName());
-       }
-
-       @Override
-       protected Boolean isModelInitialized(Node textNode)
-                       throws RepositoryException {
-               return textNode.hasProperty(Property.JCR_TITLE)
-                               || textNode.hasNode(CMS_P)
-                               || (!isFlat() && textNode.hasNode(CMS_H));
-       }
-
-       @Override
-       public Section getMainSection() {
-               // TODO Auto-generated method stub
-               return super.getMainSection();
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextContextMenu.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextContextMenu.java
deleted file mode 100644 (file)
index f9cdbb5..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.argeo.cms.text;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.viewers.SectionPart;
-import org.argeo.cms.ui.widgets.TextStyles;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/** Dialog to edit a text part. */
-@Deprecated
-class TextContextMenu extends Shell implements CmsNames, TextStyles {
-       private final static String[] DEFAULT_TEXT_STYLES = {
-                       TextStyles.TEXT_DEFAULT, TextStyles.TEXT_PRE, TextStyles.TEXT_QUOTE };
-
-       private final AbstractTextViewer textViewer;
-
-       private static final long serialVersionUID = -3826246895162050331L;
-       private List<StyleButton> styleButtons = new ArrayList<TextContextMenu.StyleButton>();
-
-       private Label deleteButton, publishButton, editButton;
-
-       private EditablePart currentTextPart;
-
-       public TextContextMenu(AbstractTextViewer textViewer, Display display) {
-               super(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
-               this.textViewer = textViewer;
-               setLayout(new GridLayout());
-               setData(RWT.CUSTOM_VARIANT, TEXT_STYLED_TOOLS_DIALOG);
-
-               StyledToolMouseListener stml = new StyledToolMouseListener();
-               if (textViewer.getCmsEditable().isEditing()) {
-                       for (String style : DEFAULT_TEXT_STYLES) {
-                               StyleButton styleButton = new StyleButton(this, SWT.WRAP);
-                               styleButton.setData(RWT.CUSTOM_VARIANT, style);
-                               styleButton.setData(RWT.MARKUP_ENABLED, true);
-                               styleButton.addMouseListener(stml);
-                               styleButtons.add(styleButton);
-                       }
-
-                       // Delete
-                       deleteButton = new Label(this, SWT.NONE);
-                       deleteButton.setText("Delete");
-                       deleteButton.addMouseListener(stml);
-
-                       // Publish
-                       publishButton = new Label(this, SWT.NONE);
-                       publishButton.setText("Publish");
-                       publishButton.addMouseListener(stml);
-               } else if (textViewer.getCmsEditable().canEdit()) {
-                       // Edit
-                       editButton = new Label(this, SWT.NONE);
-                       editButton.setText("Edit");
-                       editButton.addMouseListener(stml);
-               }
-               addShellListener(new ToolsShellListener());
-       }
-
-       public void show(EditablePart source, Point location) {
-               if (isVisible())
-                       setVisible(false);
-
-               this.currentTextPart = source;
-
-               if (currentTextPart instanceof Paragraph) {
-                       final int size = 32;
-                       String text = textViewer
-                                       .getRawParagraphText((Paragraph) currentTextPart);
-                       String textToShow = text.length() > size ? text.substring(0,
-                                       size - 3) + "..." : text;
-                       for (StyleButton styleButton : styleButtons) {
-                               styleButton.setText(textToShow);
-                       }
-               }
-               pack();
-               layout();
-               if (source instanceof Control)
-                       setLocation(((Control) source).toDisplay(location.x, location.y));
-               open();
-       }
-
-       class StyleButton extends Label {
-               private static final long serialVersionUID = 7731102609123946115L;
-
-               public StyleButton(Composite parent, int swtStyle) {
-                       super(parent, swtStyle);
-               }
-
-       }
-
-       class StyledToolMouseListener extends MouseAdapter {
-               private static final long serialVersionUID = 8516297091549329043L;
-
-               @Override
-               public void mouseDown(MouseEvent e) {
-                       Object eventSource = e.getSource();
-                       if (eventSource instanceof StyleButton) {
-                               StyleButton sb = (StyleButton) e.getSource();
-                               String style = sb.getData(RWT.CUSTOM_VARIANT).toString();
-                               textViewer
-                                               .setParagraphStyle((Paragraph) currentTextPart, style);
-                       } else if (eventSource == deleteButton) {
-                               textViewer.deletePart((SectionPart) currentTextPart);
-                       } else if (eventSource == editButton) {
-                               textViewer.getCmsEditable().startEditing();
-                       } else if (eventSource == publishButton) {
-                               textViewer.getCmsEditable().stopEditing();
-                       }
-                       setVisible(false);
-               }
-       }
-
-       class ToolsShellListener extends org.eclipse.swt.events.ShellAdapter {
-               private static final long serialVersionUID = 8432350564023247241L;
-
-               @Override
-               public void shellDeactivated(ShellEvent e) {
-                       setVisible(false);
-               }
-
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextEditorHeader.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextEditorHeader.java
deleted file mode 100644 (file)
index d10395b..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.argeo.cms.text;
-
-import java.util.Observable;
-import java.util.Observer;
-
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.widgets.TextStyles;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-
-/** Adds editing capabilities to a page editing text */
-public class TextEditorHeader implements SelectionListener, Observer {
-       private static final long serialVersionUID = 4186756396045701253L;
-
-       private final CmsEditable cmsEditable;
-       private Button publish;
-
-       private Composite parent;
-       private Composite display;
-       private Object layoutData;
-
-       public TextEditorHeader(CmsEditable cmsEditable, Composite parent, int style) {
-               this.cmsEditable = cmsEditable;
-               this.parent = parent;
-               if (this.cmsEditable instanceof Observable)
-                       ((Observable) this.cmsEditable).addObserver(this);
-               refresh();
-       }
-
-       protected void refresh() {
-               if (display != null && !display.isDisposed())
-                       display.dispose();
-               display = null;
-               publish = null;
-               if (cmsEditable.isEditing()) {
-                       display = new Composite(parent, SWT.NONE);
-                       // display.setBackgroundMode(SWT.INHERIT_NONE);
-                       display.setLayoutData(layoutData);
-                       display.setLayout(CmsUiUtils.noSpaceGridLayout());
-                       CmsUiUtils.style(display, TextStyles.TEXT_EDITOR_HEADER);
-                       publish = new Button(display, SWT.FLAT | SWT.PUSH);
-                       publish.setText(getPublishButtonLabel());
-                       CmsUiUtils.style(publish, TextStyles.TEXT_EDITOR_HEADER);
-                       publish.addSelectionListener(this);
-                       display.moveAbove(null);
-               }
-               parent.layout();
-       }
-
-       private String getPublishButtonLabel() {
-               if (cmsEditable.isEditing())
-                       return "Publish";
-               else
-                       return "Edit";
-       }
-
-       @Override
-       public void widgetSelected(SelectionEvent e) {
-               if (e.getSource() == publish) {
-                       if (cmsEditable.isEditing()) {
-                               cmsEditable.stopEditing();
-                       } else {
-                               cmsEditable.startEditing();
-                       }
-                       // publish.setText(getPublishButtonLabel());
-               }
-       }
-
-       @Override
-       public void widgetDefaultSelected(SelectionEvent e) {
-       }
-
-       @Override
-       public void update(Observable o, Object arg) {
-               if (o == cmsEditable) {
-                       // publish.setText(getPublishButtonLabel());
-                       refresh();
-               }
-       }
-
-       public void setLayoutData(Object layoutData) {
-               this.layoutData = layoutData;
-               if (display != null && !display.isDisposed())
-                       display.setLayoutData(layoutData);
-       }
-
-}
\ No newline at end of file
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextInterpreter.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextInterpreter.java
deleted file mode 100644 (file)
index 5c94e66..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.cms.text;
-
-import javax.jcr.Item;
-
-/** Convert from/to data layer to/from presentation layer. */
-public interface TextInterpreter {
-       String raw(Item item);
-
-       String read(Item item);
-
-       String readSimpleHtml(Item item);
-
-       void write(Item item, String content);
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextInterpreterImpl.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextInterpreterImpl.java
deleted file mode 100644 (file)
index 813fa0f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.argeo.cms.text;
-
-import javax.jcr.Item;
-import javax.jcr.RepositoryException;
-
-/**
- * Text interpreter that sanitise and validates before saving, and support CMS
- * specific formatting and integration.
- */
-class TextInterpreterImpl extends IdentityTextInterpreter {
-       private MarkupValidatorCopy markupValidator = MarkupValidatorCopy.getInstance();
-
-       @Override
-       protected void validateBeforeStoring(String raw) {
-               markupValidator.validate(raw);
-       }
-
-       @Override
-       protected String convertToStorage(Item item, String content) throws RepositoryException {
-               return super.convertToStorage(item, content);
-       }
-
-       @Override
-       protected String convertFromStorage(Item item, String content) throws RepositoryException {
-               return super.convertFromStorage(item, content);
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextSection.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/TextSection.java
deleted file mode 100644 (file)
index 894a2cf..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.argeo.cms.text;
-
-import javax.jcr.Node;
-
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.cms.ui.widgets.TextStyles;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** An editable section. */
-public class TextSection extends Section {
-       private static final long serialVersionUID = -8625209546243220689L;
-       private String defaultTextStyle = TextStyles.TEXT_DEFAULT;
-       private String titleStyle;
-
-       private final boolean flat;
-
-       private boolean titleReadOnly = false;
-
-       public TextSection(Composite parent, int style, Node node) {
-               this(parent, findSection(parent), style, node);
-       }
-
-       public TextSection(TextSection section, int style, Node node) {
-               this(section, section.getParentSection(), style, node);
-       }
-
-       private TextSection(Composite parent, Section parentSection, int style, Node node) {
-               super(parent, parentSection, style, node);
-               flat = SWT.FLAT == (style & SWT.FLAT);
-               // CmsUiUtils.style(this, TextStyles.TEXT_SECTION);
-       }
-
-       public String getDefaultTextStyle() {
-               return defaultTextStyle;
-       }
-
-       public boolean isFlat() {
-               return flat;
-       }
-
-       public String getTitleStyle() {
-               if (titleStyle != null)
-                       return titleStyle;
-               // TODO make base H styles configurable
-               Integer relativeDepth = getRelativeDepth();
-               return relativeDepth == 0 ? TextStyles.TEXT_TITLE : TextStyles.TEXT_H + relativeDepth;
-       }
-
-       public void setDefaultTextStyle(String defaultTextStyle) {
-               this.defaultTextStyle = defaultTextStyle;
-       }
-
-       public void setTitleStyle(String titleStyle) {
-               this.titleStyle = titleStyle;
-       }
-
-       public boolean isTitleReadOnly() {
-               return titleReadOnly;
-       }
-
-       public void setTitleReadOnly(boolean titleReadOnly) {
-               this.titleReadOnly = titleReadOnly;
-       }       
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/WikiPage.java b/publishing/org.argeo.publishing.ui/src/org/argeo/cms/text/WikiPage.java
deleted file mode 100644 (file)
index ac0fe50..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.argeo.cms.text;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsLink;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.JcrVersionCmsEditable;
-import org.argeo.cms.ui.widgets.ScrolledPage;
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** Display the text of the context, and provide an editor if the user can edit. */
-public class WikiPage implements CmsUiProvider, CmsNames {
-       @Override
-       public Control createUi(Composite parent, Node context)
-                       throws RepositoryException {
-               CmsEditable cmsEditable = new JcrVersionCmsEditable(context);
-               if (cmsEditable.canEdit())
-                       new TextEditorHeader(cmsEditable, parent, SWT.NONE)
-                                       .setLayoutData(CmsUiUtils.fillWidth());
-
-               ScrolledPage page = new ScrolledPage(parent, SWT.NONE);
-               page.setLayout(CmsUiUtils.noSpaceGridLayout());
-               GridData textGd = CmsUiUtils.fillAll();
-               page.setLayoutData(textGd);
-
-               if (context.isNodeType(CmsTypes.CMS_TEXT)) {
-                       new StandardTextEditor(page, SWT.NONE, context, cmsEditable);
-               } else if (context.isNodeType(NodeType.NT_FOLDER)
-                               || context.getPath().equals("/")) {
-                       parent.setBackgroundMode(SWT.INHERIT_NONE);
-                       if (context.getSession().hasPermission(context.getPath(),
-                                       Session.ACTION_ADD_NODE)) {
-                               Node indexNode = JcrUtils.getOrAdd(context, CMS_INDEX,
-                                               CmsTypes.CMS_TEXT);
-                               new StandardTextEditor(page, SWT.NONE, indexNode, cmsEditable);
-                               textGd.heightHint = 400;
-
-                               for (NodeIterator ni = context.getNodes(); ni.hasNext();) {
-                                       Node textNode = ni.nextNode();
-                                       if (textNode.isNodeType(NodeType.NT_FOLDER))
-                                               new CmsLink(textNode.getName() + "/",
-                                                               textNode.getPath()).createUi(parent, textNode);
-                               }
-                               for (NodeIterator ni = context.getNodes(); ni.hasNext();) {
-                                       Node textNode = ni.nextNode();
-                                       if (textNode.isNodeType(CmsTypes.CMS_TEXT)
-                                                       && !textNode.getName().equals(CMS_INDEX))
-                                               new CmsLink(textNode.getName(), textNode.getPath())
-                                                               .createUi(parent, textNode);
-                               }
-                       }
-               }
-               return page;
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkAttr.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkAttr.java
deleted file mode 100644 (file)
index c8b7b2d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.argeo.docbook;
-
-/** Supported DocBook attributes. */
-public enum DbkAttr {
-       role,
-       //
-       fileref, contentwidth, contentdepth
-       //
-       ;
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkMsg.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkMsg.java
deleted file mode 100644 (file)
index 7f82178..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.docbook;
-
-import org.argeo.cms.Localized;
-
-/** DocBook related messages. */
-public enum DbkMsg implements Localized {
-       paragraph, deleteParagraph,
-       //
-       section, deleteSection,
-       //
-       media, deleteMedia, insertMedia, insertParagraph,
-       //
-       ;
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkType.java
deleted file mode 100644 (file)
index 423add3..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.argeo.docbook;
-
-import org.argeo.entity.JcrName;
-
-/** Supported DocBook elements */
-public enum DbkType implements JcrName {
-       book, article, section,
-       //
-       info, title, para,
-       //
-       mediaobject, imageobject, imagedata,
-       //
-       ;
-
-       @Override
-       public String getPrefix() {
-               return prefix();
-       }
-
-       public static String prefix() {
-               return "dbk";
-       }
-
-       @Override
-       public String getNamespace() {
-               return namespace();
-       }
-
-       public static String namespace() {
-               return "http://docbook.org/ns/docbook";
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkUtils.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/DbkUtils.java
deleted file mode 100644 (file)
index 44346b2..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-package org.argeo.docbook;
-
-import static org.argeo.docbook.DbkType.para;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-
-import javax.jcr.ImportUUIDBehavior;
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.jcr.JcrxApi;
-
-/** Utilities around DocBook. */
-public class DbkUtils {
-       private final static Log log = LogFactory.getLog(DbkUtils.class);
-
-       /** Get or add a DocBook element. */
-       public static Node getOrAddDbk(Node parent, DbkType child) {
-               try {
-                       if (!parent.hasNode(child.get())) {
-                               return addDbk(parent, child);
-                       } else {
-                               return parent.getNode(child.get());
-                       }
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot get or add element " + child.get() + " to " + parent, e);
-               }
-       }
-
-       /** Add a DocBook element to this node. */
-       public static Node addDbk(Node parent, DbkType child) {
-               try {
-                       Node node = parent.addNode(child.get(), child.get());
-                       return node;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot add element " + child.get() + " to " + parent, e);
-               }
-       }
-
-       /** Whether this DocBook element is of this type. */
-       public static boolean isDbk(Node node, DbkType type) {
-               return Jcr.getName(node).equals(type.get());
-       }
-
-       /** Whether this node is a DocBook type. */
-       public static boolean isDbk(Node node) {
-               String name = Jcr.getName(node);
-               for (DbkType type : DbkType.values()) {
-                       if (name.equals(type.get()))
-                               return true;
-               }
-               return false;
-       }
-
-       public static String getTitle(Node node) {
-               return JcrxApi.getXmlValue(node, DbkType.title.get());
-       }
-
-       public static void setTitle(Node node, String txt) {
-               Node titleNode = getOrAddDbk(node, DbkType.title);
-               JcrxApi.setXmlValue(node, titleNode, txt);
-       }
-
-       public static Node getMetadata(Node infoContainer) {
-               try {
-                       if (!infoContainer.hasNode(DbkType.info.get()))
-                               return null;
-                       Node info = infoContainer.getNode(DbkType.info.get());
-                       if (!info.hasNode(EntityType.local.get()))
-                               return null;
-                       return info.getNode(EntityType.local.get());
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot retrieve metadata from " + infoContainer, e);
-               }
-       }
-
-       public static Node getChildByRole(Node parent, String role) {
-               try {
-                       NodeIterator baseSections = parent.getNodes();
-                       while (baseSections.hasNext()) {
-                               Node n = baseSections.nextNode();
-                               String r = Jcr.get(n, DbkAttr.role.name());
-                               if (r != null && r.equals(role))
-                                       return n;
-                       }
-                       return null;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot get child from " + parent + " with role " + role, e);
-               }
-       }
-
-       public static Node addParagraph(Node node, String txt) {
-               Node p = addDbk(node, para);
-               JcrxApi.setXmlValue(node, p, txt);
-               return p;
-       }
-
-       public static Node insertImageAfter(Node sibling) {
-               try {
-
-                       Node parent = sibling.getParent();
-                       Node mediaNode = addDbk(parent, DbkType.mediaobject);
-                       // TODO optimise?
-                       parent.orderBefore(mediaNode.getName() + "[" + mediaNode.getIndex() + "]",
-                                       sibling.getName() + "[" + sibling.getIndex() + "]");
-                       parent.orderBefore(sibling.getName() + "[" + sibling.getIndex() + "]",
-                                       mediaNode.getName() + "[" + mediaNode.getIndex() + "]");
-
-                       Node imageNode = addDbk(mediaNode, DbkType.imageobject);
-                       Node imageDataNode = addDbk(imageNode, DbkType.imagedata);
-//                     Node infoNode = imageNode.addNode(DocBookTypes.INFO, DocBookTypes.INFO);
-//                     Node fileNode = JcrUtils.copyBytesAsFile(mediaFolder, EntityType.box.get(), new byte[0]);
-//                     fileNode.addMixin(EntityType.box.get());
-//                     fileNode.setProperty(EntityNames.SVG_WIDTH, 0);
-//                     fileNode.setProperty(EntityNames.SVG_LENGTH, 0);
-//                     fileNode.addMixin(NodeType.MIX_MIMETYPE);
-//
-//                     // we assume this is a folder next to the main DocBook document
-//                     // TODO make it more robust and generic
-//                     String fileRef = mediaNode.getName();
-//                     imageDataNode.setProperty(DocBookNames.DBK_FILEREF, fileRef);
-                       return mediaNode;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot insert empty image after " + sibling, e);
-               }
-       }
-
-       public static void exportXml(Node node, OutputStream out) throws IOException {
-               try {
-                       node.getSession().exportDocumentView(node.getPath(), out, false, false);
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot export " + node + " to XML", e);
-               }
-       }
-
-       public static void exportToFs(Node baseNode, DbkType type, Path directory) {
-               String fileName = Jcr.getName(baseNode) + ".dbk.xml";
-               Path filePath = directory.resolve(fileName);
-               Node docBookNode = Jcr.getNode(baseNode, type.get());
-               if (docBookNode == null)
-                       throw new IllegalArgumentException("No " + type.get() + " under " + baseNode);
-               try {
-                       Files.createDirectories(directory);
-                       try (OutputStream out = Files.newOutputStream(filePath)) {
-                               exportXml(docBookNode, out);
-                       }
-                       JcrUtils.copyFilesToFs(baseNode, directory, true);
-                       if (log.isDebugEnabled())
-                               log.debug("DocBook " + baseNode + " exported to " + filePath.toAbsolutePath());
-               } catch (IOException e) {
-                       throw new RuntimeException(e);
-               }
-       }
-
-       public static void importXml(Node baseNode, InputStream in) throws IOException {
-               try {
-                       baseNode.getSession().importXML(baseNode.getPath(), in,
-                                       ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot import XML to " + baseNode, e);
-               }
-
-       }
-
-       /** Singleton. */
-       private DbkUtils() {
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/docbook-full.cnd b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/docbook-full.cnd
deleted file mode 100644 (file)
index 79c3882..0000000
+++ /dev/null
@@ -1,2998 +0,0 @@
-<dbk = 'http://docbook.org/ns/docbook'>
-<argeodbk = 'http://www.argeo.org/ns/argeodbk'>
-<xlink = 'http://www.w3.org/1999/xlink'>
-//<xs = 'http://www.w3.org/2001/XMLSchema'>
-
-[argeodbk:titled]
-mixin
- + dbk:info (dbk:info) = dbk:info *
- + dbk:title (dbk:title) = dbk:title *
- + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
-
-[argeodbk:linkingAttributes]
-mixin
- - linkend (String)
- - xlink:actuate (String)
- - xlink:arcrole (String)
- - xlink:href (String)
- - xlink:role (String)
- - xlink:show (String)
- - xlink:title (String)
- - xlink:type (String)
-
-[argeodbk:freeText]
-mixin
- + dbk:phrase (dbk:phrase) = dbk:phrase *
- + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[argeodbk:markupInlines]
-mixin
- + dbk:code (dbk:code) = dbk:code *
- + dbk:constant (dbk:constant) = dbk:constant *
- + dbk:email (dbk:email) = dbk:email *
- + dbk:literal (dbk:literal) = dbk:literal *
- + dbk:markup (dbk:markup) = dbk:markup *
- + dbk:symbol (dbk:symbol) = dbk:symbol *
- + dbk:tag (dbk:tag) = dbk:tag *
- + dbk:token (dbk:token) = dbk:token *
- + dbk:uri (dbk:uri) = dbk:uri *
-
-[argeodbk:listElements]
-mixin
- + dbk:bibliolist (dbk:bibliolist) = dbk:bibliolist *
- + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
- + dbk:glosslist (dbk:glosslist) = dbk:glosslist *
- + dbk:itemizedlist (dbk:itemizedlist) = dbk:itemizedlist *
- + dbk:orderedlist (dbk:orderedlist) = dbk:orderedlist *
- + dbk:procedure (dbk:procedure) = dbk:procedure *
- + dbk:qandaset (dbk:qandaset) = dbk:qandaset *
- + dbk:segmentedlist (dbk:segmentedlist) = dbk:segmentedlist *
- + dbk:simplelist (dbk:simplelist) = dbk:simplelist *
- + dbk:variablelist (dbk:variablelist) = dbk:variablelist *
-
-[argeodbk:paragraphElements]
-mixin
- + dbk:formalpara (dbk:formalpara) = dbk:formalpara *
- + dbk:para (dbk:para) = dbk:para *
- + dbk:simpara (dbk:simpara) = dbk:simpara *
-
-[argeodbk:indexingInlines]
-mixin
- + dbk:indexterm (dbk:indexterm) = dbk:indexterm *
-
-[argeodbk:techDocElements]
-mixin
- + dbk:caution (dbk:caution) = dbk:caution *
- + dbk:classsynopsis (dbk:classsynopsis) = dbk:classsynopsis *
- + dbk:cmdsynopsis (dbk:cmdsynopsis) = dbk:cmdsynopsis *
- + dbk:constraintdef (dbk:constraintdef) = dbk:constraintdef *
- + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis *
- + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis *
- + dbk:equation (dbk:equation) = dbk:equation *
- + dbk:example (dbk:example) = dbk:example *
- + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis *
- + dbk:figure (dbk:figure) = dbk:figure *
- + dbk:funcsynopsis (dbk:funcsynopsis) = dbk:funcsynopsis *
- + dbk:important (dbk:important) = dbk:important *
- + dbk:informalequation (dbk:informalequation) = dbk:informalequation *
- + dbk:informalexample (dbk:informalexample) = dbk:informalexample *
- + dbk:informalfigure (dbk:informalfigure) = dbk:informalfigure *
- + dbk:informaltable (dbk:informaltable) = dbk:informaltable *
- + dbk:literallayout (dbk:literallayout) = dbk:literallayout *
- + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis *
- + dbk:msgset (dbk:msgset) = dbk:msgset *
- + dbk:note (dbk:note) = dbk:note *
- + dbk:productionset (dbk:productionset) = dbk:productionset *
- + dbk:programlisting (dbk:programlisting) = dbk:programlisting *
- + dbk:programlistingco (dbk:programlistingco) = dbk:programlistingco *
- + dbk:screen (dbk:screen) = dbk:screen *
- + dbk:screenco (dbk:screenco) = dbk:screenco *
- + dbk:synopsis (dbk:synopsis) = dbk:synopsis *
- + dbk:table (dbk:table) = dbk:table *
- + dbk:task (dbk:task) = dbk:task *
- + dbk:tip (dbk:tip) = dbk:tip *
- + dbk:warning (dbk:warning) = dbk:warning *
-
-[argeodbk:techDocInlines]
-mixin
- + dbk:accel (dbk:accel) = dbk:accel *
- + dbk:application (dbk:application) = dbk:application *
- + dbk:classname (dbk:classname) = dbk:classname *
- + dbk:command (dbk:command) = dbk:command *
- + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput *
- + dbk:database (dbk:database) = dbk:database *
- + dbk:envar (dbk:envar) = dbk:envar *
- + dbk:errorcode (dbk:errorcode) = dbk:errorcode *
- + dbk:errorname (dbk:errorname) = dbk:errorname *
- + dbk:errortext (dbk:errortext) = dbk:errortext *
- + dbk:errortype (dbk:errortype) = dbk:errortype *
- + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
- + dbk:filename (dbk:filename) = dbk:filename *
- + dbk:function (dbk:function) = dbk:function *
- + dbk:guibutton (dbk:guibutton) = dbk:guibutton *
- + dbk:guiicon (dbk:guiicon) = dbk:guiicon *
- + dbk:guilabel (dbk:guilabel) = dbk:guilabel *
- + dbk:guimenu (dbk:guimenu) = dbk:guimenu *
- + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem *
- + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu *
- + dbk:hardware (dbk:hardware) = dbk:hardware *
- + dbk:initializer (dbk:initializer) = dbk:initializer *
- + dbk:inlineequation (dbk:inlineequation) = dbk:inlineequation *
- + dbk:interfacename (dbk:interfacename) = dbk:interfacename *
- + dbk:keycap (dbk:keycap) = dbk:keycap *
- + dbk:keycode (dbk:keycode) = dbk:keycode *
- + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
- + dbk:keysym (dbk:keysym) = dbk:keysym *
- + dbk:menuchoice (dbk:menuchoice) = dbk:menuchoice *
- + dbk:methodname (dbk:methodname) = dbk:methodname *
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
- + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
- + dbk:ooclass (dbk:ooclass) = dbk:ooclass *
- + dbk:ooexception (dbk:ooexception) = dbk:ooexception *
- + dbk:oointerface (dbk:oointerface) = dbk:oointerface *
- + dbk:option (dbk:option) = dbk:option *
- + dbk:optional (dbk:optional) = dbk:optional *
- + dbk:package (dbk:package) = dbk:package *
- + dbk:parameter (dbk:parameter) = dbk:parameter *
- + dbk:productname (dbk:productname) = dbk:productname *
- + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
- + dbk:prompt (dbk:prompt) = dbk:prompt *
- + dbk:property (dbk:property) = dbk:property *
- + dbk:returnvalue (dbk:returnvalue) = dbk:returnvalue *
- + dbk:shortcut (dbk:shortcut) = dbk:shortcut *
- + dbk:systemitem (dbk:systemitem) = dbk:systemitem *
- + dbk:termdef (dbk:termdef) = dbk:termdef *
- + dbk:trademark (dbk:trademark) = dbk:trademark *
- + dbk:type (dbk:type) = dbk:type *
- + dbk:userinput (dbk:userinput) = dbk:userinput *
- + dbk:varname (dbk:varname) = dbk:varname *
-
-[argeodbk:publishingElements]
-mixin
- + dbk:address (dbk:address) = dbk:address *
- + dbk:blockquote (dbk:blockquote) = dbk:blockquote *
- + dbk:epigraph (dbk:epigraph) = dbk:epigraph *
- + dbk:sidebar (dbk:sidebar) = dbk:sidebar *
-
-[argeodbk:ubiquitousInlines]
-mixin
- + dbk:alt (dbk:alt) = dbk:alt *
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:biblioref (dbk:biblioref) = dbk:biblioref *
- + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
- + dbk:link (dbk:link) = dbk:link *
- + dbk:olink (dbk:olink) = dbk:olink *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:subscript (dbk:subscript) = dbk:subscript *
- + dbk:superscript (dbk:superscript) = dbk:superscript *
- + dbk:xref (dbk:xref) = dbk:xref *
-
-[argeodbk:abstractSection]
-mixin
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bibliography (dbk:bibliography) = dbk:bibliography *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:glossary (dbk:glossary) = dbk:glossary *
- + dbk:index (dbk:index) = dbk:index *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:toc (dbk:toc) = dbk:toc *
- - label (String)
- - status (String)
-
-[argeodbk:bibliographyInlines]
-mixin
- + dbk:author (dbk:author) = dbk:author *
- + dbk:citation (dbk:citation) = dbk:citation *
- + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
- + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
- + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:jobtitle (dbk:jobtitle) = dbk:jobtitle *
- + dbk:org (dbk:org) = dbk:org *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:person (dbk:person) = dbk:person *
- + dbk:personname (dbk:personname) = dbk:personname *
-
-[argeodbk:publishingInlines]
-mixin
- + dbk:abbrev (dbk:abbrev) = dbk:abbrev *
- + dbk:acronym (dbk:acronym) = dbk:acronym *
- + dbk:coref (dbk:coref) = dbk:coref *
- + dbk:date (dbk:date) = dbk:date *
- + dbk:emphasis (dbk:emphasis) = dbk:emphasis *
- + dbk:firstterm (dbk:firstterm) = dbk:firstterm *
- + dbk:footnote (dbk:footnote) = dbk:footnote *
- + dbk:footnoteref (dbk:footnoteref) = dbk:footnoteref *
- + dbk:foreignphrase (dbk:foreignphrase) = dbk:foreignphrase *
- + dbk:glossterm (dbk:glossterm) = dbk:glossterm *
- + dbk:quote (dbk:quote) = dbk:quote *
- + dbk:wordasword (dbk:wordasword) = dbk:wordasword *
-
-[argeodbk:base]
-abstract
-orderable
- - annotations (String)
- - arch (String)
- - audience (String)
- - condition (String)
- - conformance (String)
- - dir (String)
- - os (String)
- - remap (String)
- - revision (String)
- - revisionflag (String)
- - role (String)
- - security (String)
- - userlevel (String)
- - vendor (String)
- - version (String)
- - wordsize (String)
- - xreflabel (String)
-
-[dbk:abbrev] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:trademark (dbk:trademark) = dbk:trademark *
-
-[dbk:abstract] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
-
-[dbk:accel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:acknowledgements] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:acronym] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:trademark (dbk:trademark) = dbk:trademark *
-
-[dbk:address] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:city (dbk:city) = dbk:city *
- + dbk:country (dbk:country) = dbk:country *
- + dbk:email (dbk:email) = dbk:email *
- + dbk:fax (dbk:fax) = dbk:fax *
- + dbk:otheraddr (dbk:otheraddr) = dbk:otheraddr *
- + dbk:personname (dbk:personname) = dbk:personname *
- + dbk:phone (dbk:phone) = dbk:phone *
- + dbk:pob (dbk:pob) = dbk:pob *
- + dbk:postcode (dbk:postcode) = dbk:postcode *
- + dbk:state (dbk:state) = dbk:state *
- + dbk:street (dbk:street) = dbk:street *
- + dbk:uri (dbk:uri) = dbk:uri *
- - continuation (String) 
- - language (String) 
- - linenumbering (String) 
- - startinglinenumber (String) 
- - xml:space (String) 
-
-[dbk:affiliation] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:jobtitle (dbk:jobtitle) = dbk:jobtitle *
- + dbk:org (dbk:org) = dbk:org
- + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
- + dbk:orgname (dbk:orgname) = dbk:orgname
- + dbk:shortaffil (dbk:shortaffil) = dbk:shortaffil
-
-[dbk:alt] > argeodbk:base
- + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:anchor] > argeodbk:base
-
-[dbk:annotation] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - annotates (String) 
-
-[dbk:answer] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:label (dbk:label) = dbk:label
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:appendix] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect1 (dbk:sect1) = dbk:sect1 *
- + dbk:section (dbk:section) = dbk:section *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:application] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:arc] > argeodbk:base
- - xlink:from (String) 
- - xlink:to (String) 
-
-[dbk:area] > argeodbk:base
- + dbk:alt (dbk:alt) = dbk:alt
- - coords (String) 
- - label (String) 
- - linkends (String) 
- - otherunits (String) 
- - units (String) 
-
-[dbk:areaset] > argeodbk:base
- + dbk:area (dbk:area) = dbk:area *
- - label (String) 
- - linkends (String) 
- - otherunits (String) 
- - units (String) 
-
-[dbk:areaspec] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:area (dbk:area) = dbk:area *
- + dbk:areaset (dbk:areaset) = dbk:areaset *
- - otherunits (String) 
- - units (String) 
-
-[dbk:arg] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:arg (dbk:arg) = dbk:arg *
- + dbk:group (dbk:group) = dbk:group *
- + dbk:option (dbk:option) = dbk:option *
- + dbk:sbr (dbk:sbr) = dbk:sbr *
- + dbk:synopfragmentref (dbk:synopfragmentref) = dbk:synopfragmentref *
- - choice (String) 
- - rep (String) 
-
-[dbk:article] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements *
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:appendix (dbk:appendix) = dbk:appendix *
- + dbk:colophon (dbk:colophon) = dbk:colophon *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect1 (dbk:sect1) = dbk:sect1 *
- + dbk:section (dbk:section) = dbk:section *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- - class (String) 
-
-[dbk:artpagenums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:attribution] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:citation (dbk:citation) = dbk:citation *
- + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
- + dbk:person (dbk:person) = dbk:person *
- + dbk:personname (dbk:personname) = dbk:personname *
-
-[dbk:audiodata] > argeodbk:base
- + dbk:info (dbk:info) = dbk:info
- - entityref (String) 
- - fileref (String) 
- - format (String) 
-
-[dbk:audioobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:audiodata (dbk:audiodata) = dbk:audiodata
- + dbk:info (dbk:info) = dbk:info
-
-[dbk:author] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
- + dbk:contrib (dbk:contrib) = dbk:contrib *
- + dbk:email (dbk:email) = dbk:email *
- + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
- + dbk:orgname (dbk:orgname) = dbk:orgname
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname
- + dbk:uri (dbk:uri) = dbk:uri *
-
-[dbk:authorgroup] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:author (dbk:author) = dbk:author *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
-
-[dbk:authorinitials] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:bibliocoverage] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - otherspatial (String) 
- - othertemporal (String) 
- - spatial (String) 
- - temporal (String) 
-
-[dbk:bibliodiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry *
- + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:biblioentry] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines
- + dbk:abstract (dbk:abstract) = dbk:abstract *
- + dbk:address (dbk:address) = dbk:address *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
- + dbk:author (dbk:author) = dbk:author *
- + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
- + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
- + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
- + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
- + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
- + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
- + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
- + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
- + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
- + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
- + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
- + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
- + dbk:collab (dbk:collab) = dbk:collab *
- + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
- + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
- + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
- + dbk:copyright (dbk:copyright) = dbk:copyright *
- + dbk:cover (dbk:cover) = dbk:cover *
- + dbk:edition (dbk:edition) = dbk:edition *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
- + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
- + dbk:itermset (dbk:itermset) = dbk:itermset *
- + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
- + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:org (dbk:org) = dbk:org *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
- + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
- + dbk:person (dbk:person) = dbk:person *
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname *
- + dbk:phrase (dbk:phrase) = dbk:phrase *
- + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
- + dbk:productname (dbk:productname) = dbk:productname *
- + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
- + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
- + dbk:publisher (dbk:publisher) = dbk:publisher *
- + dbk:publishername (dbk:publishername) = dbk:publishername *
- + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
- + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
- + dbk:subscript (dbk:subscript) = dbk:subscript *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:superscript (dbk:superscript) = dbk:superscript *
- + dbk:title (dbk:title) = dbk:title *
- + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
- + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
-
-[dbk:bibliography] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bibliodiv (dbk:bibliodiv) = dbk:bibliodiv *
- + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry *
- + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:biblioid] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - otherclass (String) 
-
-[dbk:bibliolist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:biblioentry (dbk:biblioentry) = dbk:biblioentry *
- + dbk:bibliomixed (dbk:bibliomixed) = dbk:bibliomixed *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:bibliomisc] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:bibliomixed] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines
- + dbk:abstract (dbk:abstract) = dbk:abstract *
- + dbk:address (dbk:address) = dbk:address *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
- + dbk:author (dbk:author) = dbk:author *
- + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
- + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
- + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
- + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
- + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
- + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
- + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
- + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
- + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
- + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
- + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
- + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
- + dbk:collab (dbk:collab) = dbk:collab *
- + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
- + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
- + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
- + dbk:copyright (dbk:copyright) = dbk:copyright *
- + dbk:cover (dbk:cover) = dbk:cover *
- + dbk:edition (dbk:edition) = dbk:edition *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
- + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
- + dbk:itermset (dbk:itermset) = dbk:itermset *
- + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
- + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:org (dbk:org) = dbk:org *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
- + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
- + dbk:person (dbk:person) = dbk:person *
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname *
- + dbk:phrase (dbk:phrase) = dbk:phrase *
- + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
- + dbk:productname (dbk:productname) = dbk:productname *
- + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
- + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
- + dbk:publisher (dbk:publisher) = dbk:publisher *
- + dbk:publishername (dbk:publishername) = dbk:publishername *
- + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
- + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
- + dbk:subscript (dbk:subscript) = dbk:subscript *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:superscript (dbk:superscript) = dbk:superscript *
- + dbk:title (dbk:title) = dbk:title *
- + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
- + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:bibliomset] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:publishingInlines, argeodbk:ubiquitousInlines
- + dbk:abstract (dbk:abstract) = dbk:abstract *
- + dbk:address (dbk:address) = dbk:address *
- + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
- + dbk:author (dbk:author) = dbk:author *
- + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
- + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
- + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
- + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
- + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
- + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
- + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
- + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
- + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
- + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
- + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
- + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
- + dbk:collab (dbk:collab) = dbk:collab *
- + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
- + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
- + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
- + dbk:copyright (dbk:copyright) = dbk:copyright *
- + dbk:cover (dbk:cover) = dbk:cover *
- + dbk:edition (dbk:edition) = dbk:edition *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
- + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
- + dbk:itermset (dbk:itermset) = dbk:itermset *
- + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
- + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:org (dbk:org) = dbk:org *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
- + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
- + dbk:person (dbk:person) = dbk:person *
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname *
- + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
- + dbk:productname (dbk:productname) = dbk:productname *
- + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
- + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
- + dbk:publisher (dbk:publisher) = dbk:publisher *
- + dbk:publishername (dbk:publishername) = dbk:publishername *
- + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
- + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:title (dbk:title) = dbk:title *
- + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
- + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
- - relation (String) 
-
-[dbk:biblioref] > argeodbk:base, argeodbk:linkingAttributes
- - begin (String) 
- - end (String) 
- - endterm (Reference) 
- - units (String) 
- - xrefstyle (String) 
-
-[dbk:bibliorelation] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - otherclass (String) 
- - othertype (String) 
- - type (String) 
-
-[dbk:biblioset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:publishingInlines
- + dbk:abstract (dbk:abstract) = dbk:abstract *
- + dbk:address (dbk:address) = dbk:address *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
- + dbk:author (dbk:author) = dbk:author *
- + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
- + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
- + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
- + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
- + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
- + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
- + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
- + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
- + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
- + dbk:citebiblioid (dbk:citebiblioid) = dbk:citebiblioid *
- + dbk:citerefentry (dbk:citerefentry) = dbk:citerefentry *
- + dbk:citetitle (dbk:citetitle) = dbk:citetitle *
- + dbk:collab (dbk:collab) = dbk:collab *
- + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
- + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
- + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
- + dbk:copyright (dbk:copyright) = dbk:copyright *
- + dbk:cover (dbk:cover) = dbk:cover *
- + dbk:edition (dbk:edition) = dbk:edition *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
- + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
- + dbk:itermset (dbk:itermset) = dbk:itermset *
- + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
- + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:org (dbk:org) = dbk:org *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
- + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
- + dbk:person (dbk:person) = dbk:person *
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname *
- + dbk:phrase (dbk:phrase) = dbk:phrase *
- + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
- + dbk:productname (dbk:productname) = dbk:productname *
- + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
- + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
- + dbk:publisher (dbk:publisher) = dbk:publisher *
- + dbk:publishername (dbk:publishername) = dbk:publishername *
- + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
- + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
- + dbk:subscript (dbk:subscript) = dbk:subscript *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:superscript (dbk:superscript) = dbk:superscript *
- + dbk:title (dbk:title) = dbk:title *
- + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
- + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
- - relation (String) 
-
-[dbk:bibliosource] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - otherclass (String) 
-
-[dbk:blockquote] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:attribution (dbk:attribution) = dbk:attribution
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:book] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements *
- + dbk:appendix (dbk:appendix) = dbk:appendix *
- + dbk:article (dbk:article) = dbk:article *
- + dbk:bibliography (dbk:bibliography) = dbk:bibliography *
- + dbk:chapter (dbk:chapter) = dbk:chapter *
- + dbk:colophon (dbk:colophon) = dbk:colophon *
- + dbk:dedication (dbk:dedication) = dbk:dedication *
- + dbk:glossary (dbk:glossary) = dbk:glossary *
- + dbk:index (dbk:index) = dbk:index *
- + dbk:part (dbk:part) = dbk:part *
- + dbk:preface (dbk:preface) = dbk:preface *
- + dbk:reference (dbk:reference) = dbk:reference *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:toc (dbk:toc) = dbk:toc *
- - label (String) 
- - status (String) 
-
-[dbk:bridgehead] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - otherrenderas (String) 
- - renderas (String) 
-
-[dbk:callout] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - arearefs (String) 
-
-[dbk:calloutlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:callout (dbk:callout) = dbk:callout *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:caption] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
-
-[dbk:caution] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:chapter] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect1 (dbk:sect1) = dbk:sect1 *
- + dbk:section (dbk:section) = dbk:section *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:citation] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:citebiblioid] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - otherclass (String) 
-
-[dbk:citerefentry] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:manvolnum (dbk:manvolnum) = dbk:manvolnum
- + dbk:refentrytitle (dbk:refentrytitle) = dbk:refentrytitle
-
-[dbk:citetitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - pubwork (String) 
-
-[dbk:city] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:classname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:classsynopsis] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:classsynopsisinfo (dbk:classsynopsisinfo) = dbk:classsynopsisinfo *
- + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis *
- + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis *
- + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis *
- + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis *
- + dbk:ooclass (dbk:ooclass) = dbk:ooclass *
- + dbk:ooexception (dbk:ooexception) = dbk:ooexception *
- + dbk:oointerface (dbk:oointerface) = dbk:oointerface *
- - class (String) 
- - language (String) 
-
-[dbk:classsynopsisinfo] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- + dbk:info (dbk:info) = dbk:info *
- + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- - continuation (String) 
- - language (String) 
- - linenumbering (String) 
- - startinglinenumber (String) 
- - xml:space (String) 
-
-[dbk:cmdsynopsis] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:arg (dbk:arg) = dbk:arg *
- + dbk:command (dbk:command) = dbk:command *
- + dbk:group (dbk:group) = dbk:group *
- + dbk:info (dbk:info) = dbk:info
- + dbk:sbr (dbk:sbr) = dbk:sbr *
- + dbk:synopfragment (dbk:synopfragment) = dbk:synopfragment *
- - cmdlength (String) 
- - label (String) 
- - sepchar (String) 
-
-[dbk:co] > argeodbk:base
- - label (String) 
- - linkends (String) 
-
-[dbk:code] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:classname (dbk:classname) = dbk:classname *
- + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
- + dbk:function (dbk:function) = dbk:function *
- + dbk:initializer (dbk:initializer) = dbk:initializer *
- + dbk:interfacename (dbk:interfacename) = dbk:interfacename *
- + dbk:methodname (dbk:methodname) = dbk:methodname *
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:ooclass (dbk:ooclass) = dbk:ooclass *
- + dbk:ooexception (dbk:ooexception) = dbk:ooexception *
- + dbk:oointerface (dbk:oointerface) = dbk:oointerface *
- + dbk:parameter (dbk:parameter) = dbk:parameter *
- + dbk:returnvalue (dbk:returnvalue) = dbk:returnvalue *
- + dbk:type (dbk:type) = dbk:type *
- + dbk:varname (dbk:varname) = dbk:varname *
- - language (String) 
-
-[dbk:col] > nt:base
- - align (String) 
- - annotations (String) 
- - arch (String) 
- - audience (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - condition (String) 
- - conformance (String) 
- - dir (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - os (String) 
- - remap (String) 
- - revision (String) 
- - revisionflag (String) 
- - security (String) 
- - span (String) 
- - style (String) 
- - title (String) 
- - userlevel (String) 
- - valign (String) 
- - vendor (String) 
- - version (String) 
- - width (String) 
- - wordsize (String) 
- - xreflabel (String) 
- - xml:base (String) 
- - xml:id (String) 
- - xml:lang (String) 
-
-[dbk:colgroup] > nt:base
- + dbk:col (dbk:col) = dbk:col *
- - align (String) 
- - annotations (String) 
- - arch (String) 
- - audience (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - condition (String) 
- - conformance (String) 
- - dir (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - os (String) 
- - remap (String) 
- - revision (String) 
- - revisionflag (String) 
- - security (String) 
- - span (String) 
- - style (String) 
- - title (String) 
- - userlevel (String) 
- - valign (String) 
- - vendor (String) 
- - version (String) 
- - width (String) 
- - wordsize (String) 
- - xreflabel (String) 
- - xml:base (String) 
- - xml:id (String) 
- - xml:lang (String) 
-
-[dbk:collab] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
- + dbk:org (dbk:org) = dbk:org *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:person (dbk:person) = dbk:person *
- + dbk:personname (dbk:personname) = dbk:personname *
-
-[dbk:colophon] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:colspec] > argeodbk:base, argeodbk:linkingAttributes
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colname (String) 
- - colnum (String) 
- - colsep (String) 
- - colwidth (String) 
- - rowsep (String) 
-
-[dbk:command] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:computeroutput] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- + dbk:command (dbk:command) = dbk:command *
- + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput *
- + dbk:envar (dbk:envar) = dbk:envar *
- + dbk:filename (dbk:filename) = dbk:filename *
- + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
- + dbk:option (dbk:option) = dbk:option *
- + dbk:optional (dbk:optional) = dbk:optional *
- + dbk:package (dbk:package) = dbk:package *
- + dbk:parameter (dbk:parameter) = dbk:parameter *
- + dbk:prompt (dbk:prompt) = dbk:prompt *
- + dbk:property (dbk:property) = dbk:property *
- + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
- + dbk:systemitem (dbk:systemitem) = dbk:systemitem *
- + dbk:termdef (dbk:termdef) = dbk:termdef *
- + dbk:userinput (dbk:userinput) = dbk:userinput *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:confdates] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:confgroup] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:confdates (dbk:confdates) = dbk:confdates *
- + dbk:confnum (dbk:confnum) = dbk:confnum *
- + dbk:confsponsor (dbk:confsponsor) = dbk:confsponsor *
- + dbk:conftitle (dbk:conftitle) = dbk:conftitle *
-
-[dbk:confnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:confsponsor] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:conftitle] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:constant] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:constraint] > argeodbk:base, argeodbk:linkingAttributes
-
-[dbk:constraintdef] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:constructorsynopsis] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
- + dbk:methodname (dbk:methodname) = dbk:methodname
- + dbk:methodparam (dbk:methodparam) = dbk:methodparam *
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:void (dbk:void) = dbk:void
- - language (String) 
-
-[dbk:contractnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:contractsponsor] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:contrib] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:copyright] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:holder (dbk:holder) = dbk:holder *
- + dbk:year (dbk:year) = dbk:year *
-
-[dbk:coref] > argeodbk:base, argeodbk:linkingAttributes
- - label (String) 
-
-[dbk:country] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:cover] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:classsynopsis (dbk:classsynopsis) = dbk:classsynopsis *
- + dbk:cmdsynopsis (dbk:cmdsynopsis) = dbk:cmdsynopsis *
- + dbk:constraintdef (dbk:constraintdef) = dbk:constraintdef *
- + dbk:constructorsynopsis (dbk:constructorsynopsis) = dbk:constructorsynopsis *
- + dbk:destructorsynopsis (dbk:destructorsynopsis) = dbk:destructorsynopsis *
- + dbk:fieldsynopsis (dbk:fieldsynopsis) = dbk:fieldsynopsis *
- + dbk:funcsynopsis (dbk:funcsynopsis) = dbk:funcsynopsis *
- + dbk:informalequation (dbk:informalequation) = dbk:informalequation *
- + dbk:informalexample (dbk:informalexample) = dbk:informalexample *
- + dbk:informalfigure (dbk:informalfigure) = dbk:informalfigure *
- + dbk:informaltable (dbk:informaltable) = dbk:informaltable *
- + dbk:literallayout (dbk:literallayout) = dbk:literallayout *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:methodsynopsis (dbk:methodsynopsis) = dbk:methodsynopsis *
- + dbk:msgset (dbk:msgset) = dbk:msgset *
- + dbk:productionset (dbk:productionset) = dbk:productionset *
- + dbk:programlisting (dbk:programlisting) = dbk:programlisting *
- + dbk:programlistingco (dbk:programlistingco) = dbk:programlistingco *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screen (dbk:screen) = dbk:screen *
- + dbk:screenco (dbk:screenco) = dbk:screenco *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:synopsis (dbk:synopsis) = dbk:synopsis *
- + dbk:task (dbk:task) = dbk:task *
-
-[dbk:database] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:date] > argeodbk:base, argeodbk:linkingAttributes
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:dedication] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:destructorsynopsis] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
- + dbk:methodname (dbk:methodname) = dbk:methodname
- + dbk:methodparam (dbk:methodparam) = dbk:methodparam *
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:void (dbk:void) = dbk:void
- - language (String) 
-
-[dbk:edition] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:editor] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
- + dbk:contrib (dbk:contrib) = dbk:contrib *
- + dbk:email (dbk:email) = dbk:email *
- + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
- + dbk:orgname (dbk:orgname) = dbk:orgname
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname
- + dbk:uri (dbk:uri) = dbk:uri *
-
-[dbk:email] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:emphasis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:entry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colname (String) 
- - colsep (String) 
- - morerows (String) 
- - nameend (String) 
- - namest (String) 
- - rotate (String) 
- - rowsep (String) 
- - spanname (String) 
- - valign (String) 
-
-[dbk:entrytbl] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
- + dbk:tbody (dbk:tbody) = dbk:tbody
- + dbk:thead (dbk:thead) = dbk:thead
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colname (String) 
- - cols (String) 
- - colsep (String) 
- - nameend (String) 
- - namest (String) 
- - rowsep (String) 
- - spanname (String) 
- - tgroupstyle (String) 
-
-[dbk:envar] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:epigraph] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:attribution (dbk:attribution) = dbk:attribution
- + dbk:info (dbk:info) = dbk:info
- + dbk:literallayout (dbk:literallayout) = dbk:literallayout *
-
-[dbk:equation] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:alt (dbk:alt) = dbk:alt
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- - floatstyle (String) 
- - label (String) 
- - pgwide (String) 
-
-[dbk:errorcode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:errorname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:errortext] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:errortype] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:example] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - floatstyle (String) 
- - label (String) 
- - pgwide (String) 
- - width (String) 
-
-[dbk:exceptionname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:extendedlink] > argeodbk:base
- + dbk:arc (dbk:arc) = dbk:arc *
- + dbk:locator (dbk:locator) = dbk:locator *
-
-[dbk:fax] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:fieldsynopsis] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:initializer (dbk:initializer) = dbk:initializer
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:type (dbk:type) = dbk:type
- + dbk:varname (dbk:varname) = dbk:varname
- - language (String) 
-
-[dbk:figure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - floatstyle (String) 
- - label (String) 
- - pgwide (String) 
-
-[dbk:filename] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - path (String) 
-
-[dbk:firstname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:firstterm] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - baseform (String) 
-
-[dbk:footnote] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - label (String) 
-
-[dbk:footnoteref] > argeodbk:base, argeodbk:linkingAttributes
- - label (String) 
-
-[dbk:foreignphrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:publishingInlines
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:application (dbk:application) = dbk:application *
- + dbk:biblioref (dbk:biblioref) = dbk:biblioref *
- + dbk:database (dbk:database) = dbk:database *
- + dbk:hardware (dbk:hardware) = dbk:hardware *
- + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
- + dbk:link (dbk:link) = dbk:link *
- + dbk:olink (dbk:olink) = dbk:olink *
- + dbk:phrase (dbk:phrase) = dbk:phrase *
- + dbk:productname (dbk:productname) = dbk:productname *
- + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
- + dbk:subscript (dbk:subscript) = dbk:subscript *
- + dbk:superscript (dbk:superscript) = dbk:superscript *
- + dbk:trademark (dbk:trademark) = dbk:trademark *
- + dbk:xref (dbk:xref) = dbk:xref *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:formalpara] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:para (dbk:para) = dbk:para
-
-[dbk:funcdef] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:function (dbk:function) = dbk:function *
- + dbk:type (dbk:type) = dbk:type *
-
-[dbk:funcparams] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:funcprototype] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:funcdef (dbk:funcdef) = dbk:funcdef
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:paramdef (dbk:paramdef) = dbk:paramdef *
- + dbk:varargs (dbk:varargs) = dbk:varargs
- + dbk:varargs (dbk:varargs) = dbk:varargs
- + dbk:void (dbk:void) = dbk:void
-
-[dbk:funcsynopsis] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:funcprototype (dbk:funcprototype) = dbk:funcprototype *
- + dbk:funcsynopsisinfo (dbk:funcsynopsisinfo) = dbk:funcsynopsisinfo *
- + dbk:info (dbk:info) = dbk:info
- - language (String) 
-
-[dbk:funcsynopsisinfo] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- + dbk:info (dbk:info) = dbk:info *
- + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- - continuation (String) 
- - language (String) 
- - linenumbering (String) 
- - startinglinenumber (String) 
- - xml:space (String) 
-
-[dbk:function] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:glossary] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bibliography (dbk:bibliography) = dbk:bibliography
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:glossdiv (dbk:glossdiv) = dbk:glossdiv *
- + dbk:glossentry (dbk:glossentry) = dbk:glossentry *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:glossdef] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:glossseealso (dbk:glossseealso) = dbk:glossseealso *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - subject (String) 
-
-[dbk:glossdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:glossentry (dbk:glossentry) = dbk:glossentry *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:glossentry] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
- + dbk:abbrev (dbk:abbrev) = dbk:abbrev
- + dbk:acronym (dbk:acronym) = dbk:acronym
- + dbk:glossdef (dbk:glossdef) = dbk:glossdef *
- + dbk:glosssee (dbk:glosssee) = dbk:glosssee
- + dbk:glossterm (dbk:glossterm) = dbk:glossterm
- - sortas (String) 
-
-[dbk:glosslist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:glossentry (dbk:glossentry) = dbk:glossentry *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:glosssee] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - otherterm (Reference) 
-
-[dbk:glossseealso] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - otherterm (Reference) 
-
-[dbk:glossterm] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - baseform (String) 
-
-[dbk:group] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:arg (dbk:arg) = dbk:arg *
- + dbk:group (dbk:group) = dbk:group *
- + dbk:option (dbk:option) = dbk:option *
- + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
- + dbk:sbr (dbk:sbr) = dbk:sbr *
- + dbk:synopfragmentref (dbk:synopfragmentref) = dbk:synopfragmentref *
- - choice (String) 
- - rep (String) 
-
-[dbk:guibutton] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:accel (dbk:accel) = dbk:accel *
-
-[dbk:guiicon] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:accel (dbk:accel) = dbk:accel *
-
-[dbk:guilabel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:accel (dbk:accel) = dbk:accel *
-
-[dbk:guimenu] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:accel (dbk:accel) = dbk:accel *
-
-[dbk:guimenuitem] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:accel (dbk:accel) = dbk:accel *
-
-[dbk:guisubmenu] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:accel (dbk:accel) = dbk:accel *
-
-[dbk:hardware] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:holder] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:honorific] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:imagedata] > argeodbk:base
- + dbk:info (dbk:info) = dbk:info
- - align (String) 
- - contentdepth (String) 
- - contentwidth (String) 
- - depth (String) 
- - entityref (String) 
- - fileref (String) 
- - format (String) 
- - scale (String) 
- - scalefit (String) 
- - valign (String) 
- - width (String) 
-
-[dbk:imageobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:imagedata (dbk:imagedata) = dbk:imagedata
- + dbk:info (dbk:info) = dbk:info
-
-[dbk:imageobjectco] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:areaspec (dbk:areaspec) = dbk:areaspec
- + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
- + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
- + dbk:info (dbk:info) = dbk:info
-
-[dbk:important] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:index] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:indexdiv (dbk:indexdiv) = dbk:indexdiv *
- + dbk:indexentry (dbk:indexentry) = dbk:indexentry *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
- - type (String) 
-
-[dbk:indexdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:indexentry (dbk:indexentry) = dbk:indexentry *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:indexentry] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:primaryie (dbk:primaryie) = dbk:primaryie
- + dbk:secondaryie (dbk:secondaryie) = dbk:secondaryie *
- + dbk:seealsoie (dbk:seealsoie) = dbk:seealsoie *
- + dbk:seeie (dbk:seeie) = dbk:seeie *
- + dbk:tertiaryie (dbk:tertiaryie) = dbk:tertiaryie *
-
-[dbk:indexterm] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:primary (dbk:primary) = dbk:primary
- + dbk:secondary (dbk:secondary) = dbk:secondary
- + dbk:see (dbk:see) = dbk:see
- + dbk:seealso (dbk:seealso) = dbk:seealso *
- + dbk:tertiary (dbk:tertiary) = dbk:tertiary
- - class (String) 
- - pagenum (String) 
- - scope (String) 
- - significance (String) 
- - startref (Reference) 
- - type (String) 
- - zone (String) 
-
-[dbk:info] > argeodbk:base
- + dbk:abstract (dbk:abstract) = dbk:abstract *
- + dbk:address (dbk:address) = dbk:address *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:artpagenums (dbk:artpagenums) = dbk:artpagenums *
- + dbk:author (dbk:author) = dbk:author *
- + dbk:authorgroup (dbk:authorgroup) = dbk:authorgroup *
- + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
- + dbk:bibliocoverage (dbk:bibliocoverage) = dbk:bibliocoverage *
- + dbk:biblioid (dbk:biblioid) = dbk:biblioid *
- + dbk:bibliomisc (dbk:bibliomisc) = dbk:bibliomisc *
- + dbk:bibliomset (dbk:bibliomset) = dbk:bibliomset *
- + dbk:bibliorelation (dbk:bibliorelation) = dbk:bibliorelation *
- + dbk:biblioset (dbk:biblioset) = dbk:biblioset *
- + dbk:bibliosource (dbk:bibliosource) = dbk:bibliosource *
- + dbk:collab (dbk:collab) = dbk:collab *
- + dbk:confgroup (dbk:confgroup) = dbk:confgroup *
- + dbk:contractnum (dbk:contractnum) = dbk:contractnum *
- + dbk:contractsponsor (dbk:contractsponsor) = dbk:contractsponsor *
- + dbk:copyright (dbk:copyright) = dbk:copyright *
- + dbk:cover (dbk:cover) = dbk:cover *
- + dbk:date (dbk:date) = dbk:date *
- + dbk:edition (dbk:edition) = dbk:edition *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:extendedlink (dbk:extendedlink) = dbk:extendedlink *
- + dbk:issuenum (dbk:issuenum) = dbk:issuenum *
- + dbk:itermset (dbk:itermset) = dbk:itermset *
- + dbk:keywordset (dbk:keywordset) = dbk:keywordset *
- + dbk:legalnotice (dbk:legalnotice) = dbk:legalnotice *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:org (dbk:org) = dbk:org *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:othercredit (dbk:othercredit) = dbk:othercredit *
- + dbk:pagenums (dbk:pagenums) = dbk:pagenums *
- + dbk:printhistory (dbk:printhistory) = dbk:printhistory *
- + dbk:productname (dbk:productname) = dbk:productname *
- + dbk:productnumber (dbk:productnumber) = dbk:productnumber *
- + dbk:pubdate (dbk:pubdate) = dbk:pubdate *
- + dbk:publisher (dbk:publisher) = dbk:publisher *
- + dbk:publishername (dbk:publishername) = dbk:publishername *
- + dbk:releaseinfo (dbk:releaseinfo) = dbk:releaseinfo *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:seriesvolnums (dbk:seriesvolnums) = dbk:seriesvolnums *
- + dbk:subjectset (dbk:subjectset) = dbk:subjectset *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:title (dbk:title) = dbk:title *
- + dbk:titleabbrev (dbk:titleabbrev) = dbk:titleabbrev *
- + dbk:volumenum (dbk:volumenum) = dbk:volumenum *
- + * (nt:base) = nt:unstructured *
-
-[dbk:informalequation] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:alt (dbk:alt) = dbk:alt
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:info (dbk:info) = dbk:info
- + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
-
-[dbk:informalexample] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:info (dbk:info) = dbk:info
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - floatstyle (String) 
- - width (String) 
-
-[dbk:informalfigure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:info (dbk:info) = dbk:info
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - floatstyle (String) 
- - label (String) 
- - pgwide (String) 
-
-[dbk:informaltable] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:col (dbk:col) = dbk:col *
- + dbk:colgroup (dbk:colgroup) = dbk:colgroup *
- + dbk:info (dbk:info) = dbk:info
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:tbody (dbk:tbody) = dbk:tbody *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- + dbk:tfoot (dbk:tfoot) = dbk:tfoot
- + dbk:tgroup (dbk:tgroup) = dbk:tgroup *
- + dbk:thead (dbk:thead) = dbk:thead
- + dbk:tr (dbk:tr) = dbk:tr *
- - border (String) 
- - cellpadding (String) 
- - cellspacing (String) 
- - class (String) 
- - colsep (String) 
- - floatstyle (String) 
- - frame (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - orient (String) 
- - pgwide (String) 
- - rowheader (String) 
- - rowsep (String) 
- - rules (String) 
- - style (String) 
- - summary (String) 
- - tabstyle (String) 
- - title (String) 
- - width (String) 
-
-[dbk:initializer] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:inlineequation] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:alt (dbk:alt) = dbk:alt
- + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
- + dbk:mathphrase (dbk:mathphrase) = dbk:mathphrase *
-
-[dbk:inlinemediaobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:alt (dbk:alt) = dbk:alt
- + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
- + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
- + dbk:imageobjectco (dbk:imageobjectco) = dbk:imageobjectco *
- + dbk:info (dbk:info) = dbk:info
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
-
-[dbk:interfacename] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:issuenum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:itemizedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:listitem (dbk:listitem) = dbk:listitem *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - mark (String) 
- - spacing (String) 
-
-[dbk:itermset] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
-
-[dbk:jobtitle] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:keycap] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - function (String) 
- - otherfunction (String) 
-
-[dbk:keycode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:keycombo] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:keycap (dbk:keycap) = dbk:keycap *
- + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
- + dbk:keysym (dbk:keysym) = dbk:keysym *
- + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
- - action (String) 
- - otheraction (String) 
-
-[dbk:keysym] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:keyword] > argeodbk:base, argeodbk:linkingAttributes
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:keywordset] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:keyword (dbk:keyword) = dbk:keyword *
-
-[dbk:label] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:legalnotice] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:lhs] > argeodbk:base, argeodbk:linkingAttributes
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:lineage] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:lineannotation] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:link] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - endterm (Reference) 
- - xrefstyle (String) 
-
-[dbk:listitem] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - override (String) 
-
-[dbk:literal] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:literallayout] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- + dbk:info (dbk:info) = dbk:info *
- + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- - class (String) 
- - continuation (String) 
- - language (String) 
- - linenumbering (String) 
- - startinglinenumber (String) 
- - xml:space (String) 
-
-[dbk:locator] > argeodbk:base
- - xlink:label (String) 
-
-[dbk:manvolnum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:markup] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:mathphrase] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:emphasis (dbk:emphasis) = dbk:emphasis *
-
-[dbk:mediaobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:alt (dbk:alt) = dbk:alt
- + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
- + dbk:imageobjectco (dbk:imageobjectco) = dbk:imageobjectco *
- + dbk:info (dbk:info) = dbk:info
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
-
-[dbk:member] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:menuchoice] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:guibutton (dbk:guibutton) = dbk:guibutton *
- + dbk:guiicon (dbk:guiicon) = dbk:guiicon *
- + dbk:guilabel (dbk:guilabel) = dbk:guilabel *
- + dbk:guimenu (dbk:guimenu) = dbk:guimenu *
- + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem *
- + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu *
- + dbk:shortcut (dbk:shortcut) = dbk:shortcut
-
-[dbk:methodname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:methodparam] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:funcparams (dbk:funcparams) = dbk:funcparams
- + dbk:initializer (dbk:initializer) = dbk:initializer
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:parameter (dbk:parameter) = dbk:parameter
- + dbk:type (dbk:type) = dbk:type *
- - choice (String) 
- - rep (String) 
-
-[dbk:methodsynopsis] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname *
- + dbk:methodname (dbk:methodname) = dbk:methodname
- + dbk:methodparam (dbk:methodparam) = dbk:methodparam *
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:type (dbk:type) = dbk:type
- + dbk:void (dbk:void) = dbk:void
- - language (String) 
-
-[dbk:modifier] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - xml:space (String) 
-
-[dbk:mousebutton] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:msg] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:msgmain (dbk:msgmain) = dbk:msgmain
- + dbk:msgrel (dbk:msgrel) = dbk:msgrel *
- + dbk:msgsub (dbk:msgsub) = dbk:msgsub *
-
-[dbk:msgaud] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:msgentry] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:msg (dbk:msg) = dbk:msg *
- + dbk:msgexplan (dbk:msgexplan) = dbk:msgexplan *
- + dbk:msginfo (dbk:msginfo) = dbk:msginfo
-
-[dbk:msgexplan] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:msginfo] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:msgaud (dbk:msgaud) = dbk:msgaud *
- + dbk:msglevel (dbk:msglevel) = dbk:msglevel *
- + dbk:msgorig (dbk:msgorig) = dbk:msgorig *
-
-[dbk:msglevel] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:msgmain] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:msgtext (dbk:msgtext) = dbk:msgtext
-
-[dbk:msgorig] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:msgrel] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:msgtext (dbk:msgtext) = dbk:msgtext
-
-[dbk:msgset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:msgentry (dbk:msgentry) = dbk:msgentry *
- + dbk:simplemsgentry (dbk:simplemsgentry) = dbk:simplemsgentry *
-
-[dbk:msgsub] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:msgtext (dbk:msgtext) = dbk:msgtext
-
-[dbk:msgtext] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:nonterminal] > argeodbk:base, argeodbk:linkingAttributes
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
- - def (String) 
-
-[dbk:note] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:olink] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - localinfo (String) 
- - targetdoc (String) 
- - targetptr (String) 
- - type (String) 
- - xrefstyle (String) 
-
-[dbk:ooclass] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:classname (dbk:classname) = dbk:classname
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:package (dbk:package) = dbk:package *
-
-[dbk:ooexception] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:exceptionname (dbk:exceptionname) = dbk:exceptionname
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:package (dbk:package) = dbk:package *
-
-[dbk:oointerface] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:interfacename (dbk:interfacename) = dbk:interfacename
- + dbk:modifier (dbk:modifier) = dbk:modifier *
- + dbk:package (dbk:package) = dbk:package *
-
-[dbk:option] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:optional] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:orderedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:listitem (dbk:listitem) = dbk:listitem *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - continuation (String) 
- - inheritnum (String) 
- - numeration (String) 
- - spacing (String) 
- - startingnumber (String) 
-
-[dbk:org] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
- + dbk:email (dbk:email) = dbk:email *
- + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
- + dbk:orgname (dbk:orgname) = dbk:orgname
- + dbk:uri (dbk:uri) = dbk:uri *
-
-[dbk:orgdiv] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:orgname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - otherclass (String) 
-
-[dbk:otheraddr] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:othercredit] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
- + dbk:contrib (dbk:contrib) = dbk:contrib *
- + dbk:email (dbk:email) = dbk:email *
- + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
- + dbk:orgname (dbk:orgname) = dbk:orgname
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname
- + dbk:uri (dbk:uri) = dbk:uri *
- - class (String) 
- - otherclass (String) 
-
-[dbk:othername] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:package] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:pagenums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:para] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:info (dbk:info) = dbk:info *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:paramdef] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:funcparams (dbk:funcparams) = dbk:funcparams *
- + dbk:initializer (dbk:initializer) = dbk:initializer *
- + dbk:parameter (dbk:parameter) = dbk:parameter *
- + dbk:type (dbk:type) = dbk:type *
- - choice (String) 
-
-[dbk:parameter] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:part] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:acknowledgements (dbk:acknowledgements) = dbk:acknowledgements *
- + dbk:appendix (dbk:appendix) = dbk:appendix *
- + dbk:article (dbk:article) = dbk:article *
- + dbk:bibliography (dbk:bibliography) = dbk:bibliography *
- + dbk:chapter (dbk:chapter) = dbk:chapter *
- + dbk:colophon (dbk:colophon) = dbk:colophon *
- + dbk:dedication (dbk:dedication) = dbk:dedication *
- + dbk:glossary (dbk:glossary) = dbk:glossary *
- + dbk:index (dbk:index) = dbk:index *
- + dbk:partintro (dbk:partintro) = dbk:partintro
- + dbk:preface (dbk:preface) = dbk:preface *
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:reference (dbk:reference) = dbk:reference *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:toc (dbk:toc) = dbk:toc *
- - label (String) 
- - status (String) 
-
-[dbk:partintro] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect1 (dbk:sect1) = dbk:sect1 *
- + dbk:section (dbk:section) = dbk:section *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:person] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:affiliation (dbk:affiliation) = dbk:affiliation *
- + dbk:email (dbk:email) = dbk:email *
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname
- + dbk:uri (dbk:uri) = dbk:uri *
-
-[dbk:personblurb] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
-
-[dbk:personname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:firstname (dbk:firstname) = dbk:firstname *
- + dbk:honorific (dbk:honorific) = dbk:honorific *
- + dbk:lineage (dbk:lineage) = dbk:lineage *
- + dbk:othername (dbk:othername) = dbk:othername *
- + dbk:surname (dbk:surname) = dbk:surname *
-
-[dbk:phone] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:phrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:pob] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:postcode] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:preface] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect1 (dbk:sect1) = dbk:sect1 *
- + dbk:section (dbk:section) = dbk:section *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:primary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - sortas (String) 
-
-[dbk:primaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - linkends (String) 
-
-[dbk:printhistory] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
-
-[dbk:procedure] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:step (dbk:step) = dbk:step *
-
-[dbk:production] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:constraint (dbk:constraint) = dbk:constraint *
- + dbk:lhs (dbk:lhs) = dbk:lhs
- + dbk:rhs (dbk:rhs) = dbk:rhs
-
-[dbk:productionrecap] > argeodbk:base, argeodbk:linkingAttributes
-
-[dbk:productionset] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:production (dbk:production) = dbk:production *
- + dbk:productionrecap (dbk:productionrecap) = dbk:productionrecap *
-
-[dbk:productname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:productnumber] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:programlisting] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- + dbk:info (dbk:info) = dbk:info *
- + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- - continuation (String) 
- - language (String) 
- - linenumbering (String) 
- - startinglinenumber (String) 
- - width (String) 
- - xml:space (String) 
-
-[dbk:programlistingco] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:areaspec (dbk:areaspec) = dbk:areaspec
- + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
- + dbk:info (dbk:info) = dbk:info
- + dbk:programlisting (dbk:programlisting) = dbk:programlisting
-
-[dbk:prompt] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
-
-[dbk:property] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:pubdate] > argeodbk:base, argeodbk:linkingAttributes
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:publisher] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:address (dbk:address) = dbk:address *
- + dbk:publishername (dbk:publishername) = dbk:publishername
-
-[dbk:publishername] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:qandadiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:qandadiv (dbk:qandadiv) = dbk:qandadiv *
- + dbk:qandaentry (dbk:qandaentry) = dbk:qandaentry *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:qandaentry] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:answer (dbk:answer) = dbk:answer *
- + dbk:question (dbk:question) = dbk:question
-
-[dbk:qandaset] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:qandadiv (dbk:qandadiv) = dbk:qandadiv *
- + dbk:qandaentry (dbk:qandaentry) = dbk:qandaentry *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - defaultlabel (String) 
-
-[dbk:question] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:label (dbk:label) = dbk:label
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:quote] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:refclass] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:application (dbk:application) = dbk:application *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:refdescriptor] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:refentry] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
- + dbk:info (dbk:info) = dbk:info
- + dbk:refmeta (dbk:refmeta) = dbk:refmeta
- + dbk:refnamediv (dbk:refnamediv) = dbk:refnamediv *
- + dbk:refsect1 (dbk:refsect1) = dbk:refsect1 *
- + dbk:refsection (dbk:refsection) = dbk:refsection *
- + dbk:refsynopsisdiv (dbk:refsynopsisdiv) = dbk:refsynopsisdiv
- - label (String) 
- - status (String) 
-
-[dbk:refentrytitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:reference] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:partintro (dbk:partintro) = dbk:partintro
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:refmeta] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes
- + dbk:manvolnum (dbk:manvolnum) = dbk:manvolnum
- + dbk:refentrytitle (dbk:refentrytitle) = dbk:refentrytitle
- + dbk:refmiscinfo (dbk:refmiscinfo) = dbk:refmiscinfo *
-
-[dbk:refmiscinfo] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - otherclass (String) 
-
-[dbk:refname] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:refnamediv] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:refclass (dbk:refclass) = dbk:refclass *
- + dbk:refdescriptor (dbk:refdescriptor) = dbk:refdescriptor
- + dbk:refname (dbk:refname) = dbk:refname *
- + dbk:refpurpose (dbk:refpurpose) = dbk:refpurpose
-
-[dbk:refpurpose] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:refsect1] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 *
- + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:refsect2] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refsect3 (dbk:refsect3) = dbk:refsect3 *
- + dbk:refsect3 (dbk:refsect3) = dbk:refsect3 *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:refsect3] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:refsection] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refsection (dbk:refsection) = dbk:refsection *
- + dbk:refsection (dbk:refsection) = dbk:refsection *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:refsynopsisdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refsect2 (dbk:refsect2) = dbk:refsect2 *
- + dbk:refsection (dbk:refsection) = dbk:refsection *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
-
-[dbk:releaseinfo] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:remark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:replaceable] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- - class (String) 
-
-[dbk:returnvalue] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:revdescription] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:revhistory] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:revision (dbk:revision) = dbk:revision *
-
-[dbk:revision] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:author (dbk:author) = dbk:author *
- + dbk:authorinitials (dbk:authorinitials) = dbk:authorinitials *
- + dbk:date (dbk:date) = dbk:date
- + dbk:revdescription (dbk:revdescription) = dbk:revdescription
- + dbk:revnumber (dbk:revnumber) = dbk:revnumber
- + dbk:revremark (dbk:revremark) = dbk:revremark
-
-[dbk:revnumber] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:revremark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:rhs] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
- + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
- + dbk:sbr (dbk:sbr) = dbk:sbr *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:row] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:entry (dbk:entry) = dbk:entry *
- + dbk:entrytbl (dbk:entrytbl) = dbk:entrytbl *
- - rowsep (String) 
- - valign (String) 
-
-[dbk:sbr] > argeodbk:base
-
-[dbk:screen] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- + dbk:info (dbk:info) = dbk:info *
- + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- - continuation (String) 
- - language (String) 
- - linenumbering (String) 
- - startinglinenumber (String) 
- - width (String) 
- - xml:space (String) 
-
-[dbk:screenco] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:areaspec (dbk:areaspec) = dbk:areaspec
- + dbk:calloutlist (dbk:calloutlist) = dbk:calloutlist *
- + dbk:info (dbk:info) = dbk:info
- + dbk:screen (dbk:screen) = dbk:screen
-
-[dbk:screenshot] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
-
-[dbk:secondary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - sortas (String) 
-
-[dbk:secondaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - linkends (String) 
-
-[dbk:sect1] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect2 (dbk:sect2) = dbk:sect2 *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:sect2] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect3 (dbk:sect3) = dbk:sect3 *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:sect3] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect4 (dbk:sect4) = dbk:sect4 *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:sect4] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:sect5 (dbk:sect5) = dbk:sect5 *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:sect5] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:section] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:refentry (dbk:refentry) = dbk:refentry *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:section (dbk:section) = dbk:section *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
- + dbk:simplesect (dbk:simplesect) = dbk:simplesect *
-
-[dbk:see] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:seealso] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:seealsoie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - linkends (String) 
-
-[dbk:seeie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:seg] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:seglistitem] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:seg (dbk:seg) = dbk:seg *
-
-[dbk:segmentedlist] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:seglistitem (dbk:seglistitem) = dbk:seglistitem *
- + dbk:segtitle (dbk:segtitle) = dbk:segtitle *
-
-[dbk:segtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:seriesvolnums] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:set] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:book (dbk:book) = dbk:book *
- + dbk:set (dbk:set) = dbk:set *
- + dbk:setindex (dbk:setindex) = dbk:setindex
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:toc (dbk:toc) = dbk:toc
- - label (String) 
- - status (String) 
-
-[dbk:setindex] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:indexdiv (dbk:indexdiv) = dbk:indexdiv *
- + dbk:indexentry (dbk:indexentry) = dbk:indexentry *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
- - type (String) 
-
-[dbk:shortaffil] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:shortcut] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:keycap (dbk:keycap) = dbk:keycap *
- + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
- + dbk:keysym (dbk:keysym) = dbk:keysym *
- + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
- - action (String) 
- - otheraction (String) 
-
-[dbk:sidebar] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:simpara] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:info (dbk:info) = dbk:info *
-
-[dbk:simplelist] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:member (dbk:member) = dbk:member *
- - columns (String) 
- - type (String) 
-
-[dbk:simplemsgentry] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:msgexplan (dbk:msgexplan) = dbk:msgexplan *
- + dbk:msgtext (dbk:msgtext) = dbk:msgtext
- - msgaud (String) 
- - msglevel (String) 
- - msgorig (String) 
-
-[dbk:simplesect] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:spanspec] > argeodbk:base, argeodbk:linkingAttributes
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colsep (String) 
- - nameend (String) 
- - namest (String) 
- - rowsep (String) 
- - spanname (String) 
-
-[dbk:state] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:step] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:stepalternatives (dbk:stepalternatives) = dbk:stepalternatives
- + dbk:substeps (dbk:substeps) = dbk:substeps
- - performance (String) 
-
-[dbk:stepalternatives] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:info (dbk:info) = dbk:info
- + dbk:step (dbk:step) = dbk:step *
- - performance (String) 
-
-[dbk:street] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:subject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:subjectterm (dbk:subjectterm) = dbk:subjectterm *
- - weight (String) 
-
-[dbk:subjectset] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:subject (dbk:subject) = dbk:subject *
- - scheme (String) 
-
-[dbk:subjectterm] > argeodbk:base, argeodbk:linkingAttributes
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:subscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:substeps] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:step (dbk:step) = dbk:step *
- - performance (String) 
-
-[dbk:subtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:superscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:surname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:symbol] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:synopfragment] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:arg (dbk:arg) = dbk:arg *
- + dbk:group (dbk:group) = dbk:group *
-
-[dbk:synopfragmentref] > argeodbk:base, argeodbk:linkingAttributes
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:synopsis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- + dbk:info (dbk:info) = dbk:info *
- + dbk:lineannotation (dbk:lineannotation) = dbk:lineannotation *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- - continuation (String) 
- - label (String) 
- - language (String) 
- - linenumbering (String) 
- - startinglinenumber (String) 
- - xml:space (String) 
-
-[dbk:systemitem] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- + dbk:co (dbk:co) = dbk:co *
- - class (String) 
-
-[dbk:table] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:col (dbk:col) = dbk:col *
- + dbk:colgroup (dbk:colgroup) = dbk:colgroup *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:tbody (dbk:tbody) = dbk:tbody *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- + dbk:tfoot (dbk:tfoot) = dbk:tfoot
- + dbk:tgroup (dbk:tgroup) = dbk:tgroup *
- + dbk:thead (dbk:thead) = dbk:thead
- + dbk:tr (dbk:tr) = dbk:tr *
- - border (String) 
- - cellpadding (String) 
- - cellspacing (String) 
- - class (String) 
- - colsep (String) 
- - floatstyle (String) 
- - frame (String) 
- - label (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - orient (String) 
- - pgwide (String) 
- - rowheader (String) 
- - rowsep (String) 
- - rules (String) 
- - shortentry (String) 
- - style (String) 
- - summary (String) 
- - tabstyle (String) 
- - title (String) 
- - tocentry (String) 
- - width (String) 
-
-[dbk:tag] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - namespace (String) 
-
-[dbk:task] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:example (dbk:example) = dbk:example *
- + dbk:procedure (dbk:procedure) = dbk:procedure
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:taskprerequisites (dbk:taskprerequisites) = dbk:taskprerequisites
- + dbk:taskrelated (dbk:taskrelated) = dbk:taskrelated
- + dbk:tasksummary (dbk:tasksummary) = dbk:tasksummary
-
-[dbk:taskprerequisites] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:taskrelated] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:tasksummary] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:tbody] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:row (dbk:row) = dbk:row *
- + dbk:tr (dbk:tr) = dbk:tr *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
- - valign (String) 
-
-[dbk:td] > argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - abbr (String) 
- - align (String) 
- - annotations (String) 
- - arch (String) 
- - audience (String) 
- - axis (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - colspan (String) 
- - condition (String) 
- - conformance (String) 
- - dir (String) 
- - headers (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - os (String) 
- - remap (String) 
- - revision (String) 
- - revisionflag (String) 
- - rowspan (String) 
- - scope (String) 
- - security (String) 
- - style (String) 
- - title (String) 
- - userlevel (String) 
- - valign (String) 
- - vendor (String) 
- - version (String) 
- - wordsize (String) 
- - xreflabel (String) 
- - xml:base (String) 
- - xml:id (String) 
- - xml:lang (String) 
-
-[dbk:term] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:termdef] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - baseform (String) 
- - sortas (String) 
-
-[dbk:tertiary] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - sortas (String) 
-
-[dbk:tertiaryie] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - linkends (String) 
-
-[dbk:textdata] > argeodbk:base
- + dbk:info (dbk:info) = dbk:info
- - encoding (String) 
- - entityref (String) 
- - fileref (String) 
- - format (String) 
-
-[dbk:textobject] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:info (dbk:info) = dbk:info
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:phrase (dbk:phrase) = dbk:phrase
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:textdata (dbk:textdata) = dbk:textdata
-
-[dbk:tfoot] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:row (dbk:row) = dbk:row *
- + dbk:tr (dbk:tr) = dbk:tr *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
- - valign (String) 
-
-[dbk:tgroup] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
- + dbk:tbody (dbk:tbody) = dbk:tbody
- + dbk:tfoot (dbk:tfoot) = dbk:tfoot
- + dbk:thead (dbk:thead) = dbk:thead
- - align (String) 
- - char (String) 
- - charoff (String) 
- - cols (String) 
- - colsep (String) 
- - rowsep (String) 
- - tgroupstyle (String) 
-
-[dbk:th] > argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- - abbr (String) 
- - align (String) 
- - annotations (String) 
- - arch (String) 
- - audience (String) 
- - axis (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - colspan (String) 
- - condition (String) 
- - conformance (String) 
- - dir (String) 
- - headers (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - os (String) 
- - remap (String) 
- - revision (String) 
- - revisionflag (String) 
- - rowspan (String) 
- - scope (String) 
- - security (String) 
- - style (String) 
- - title (String) 
- - userlevel (String) 
- - valign (String) 
- - vendor (String) 
- - version (String) 
- - wordsize (String) 
- - xreflabel (String) 
- - xml:base (String) 
- - xml:id (String) 
- - xml:lang (String) 
-
-[dbk:thead] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:row (dbk:row) = dbk:row *
- + dbk:tr (dbk:tr) = dbk:tr *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
- - valign (String) 
-
-[dbk:tip] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:title] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:titleabbrev] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:toc] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:tocdiv (dbk:tocdiv) = dbk:tocdiv *
- + dbk:tocentry (dbk:tocentry) = dbk:tocentry *
-
-[dbk:tocdiv] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:tocdiv (dbk:tocdiv) = dbk:tocdiv *
- + dbk:tocentry (dbk:tocentry) = dbk:tocentry *
- - pagenum (String) 
-
-[dbk:tocentry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - pagenum (String) 
-
-[dbk:token] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:tr] > nt:base
- + dbk:td (dbk:td) = dbk:td *
- + dbk:th (dbk:th) = dbk:th *
- - align (String) 
- - annotations (String) 
- - arch (String) 
- - audience (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - condition (String) 
- - conformance (String) 
- - dir (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - os (String) 
- - remap (String) 
- - revision (String) 
- - revisionflag (String) 
- - security (String) 
- - style (String) 
- - title (String) 
- - userlevel (String) 
- - valign (String) 
- - vendor (String) 
- - version (String) 
- - wordsize (String) 
- - xreflabel (String) 
- - xml:base (String) 
- - xml:id (String) 
- - xml:lang (String) 
-
-[dbk:trademark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:type] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:uri] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - type (String) 
-
-[dbk:userinput] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:ubiquitousInlines
- + dbk:accel (dbk:accel) = dbk:accel *
- + dbk:co (dbk:co) = dbk:co *
- + dbk:command (dbk:command) = dbk:command *
- + dbk:computeroutput (dbk:computeroutput) = dbk:computeroutput *
- + dbk:envar (dbk:envar) = dbk:envar *
- + dbk:filename (dbk:filename) = dbk:filename *
- + dbk:guibutton (dbk:guibutton) = dbk:guibutton *
- + dbk:guiicon (dbk:guiicon) = dbk:guiicon *
- + dbk:guilabel (dbk:guilabel) = dbk:guilabel *
- + dbk:guimenu (dbk:guimenu) = dbk:guimenu *
- + dbk:guimenuitem (dbk:guimenuitem) = dbk:guimenuitem *
- + dbk:guisubmenu (dbk:guisubmenu) = dbk:guisubmenu *
- + dbk:keycap (dbk:keycap) = dbk:keycap *
- + dbk:keycode (dbk:keycode) = dbk:keycode *
- + dbk:keycombo (dbk:keycombo) = dbk:keycombo *
- + dbk:keysym (dbk:keysym) = dbk:keysym *
- + dbk:menuchoice (dbk:menuchoice) = dbk:menuchoice *
- + dbk:mousebutton (dbk:mousebutton) = dbk:mousebutton *
- + dbk:nonterminal (dbk:nonterminal) = dbk:nonterminal *
- + dbk:option (dbk:option) = dbk:option *
- + dbk:optional (dbk:optional) = dbk:optional *
- + dbk:package (dbk:package) = dbk:package *
- + dbk:parameter (dbk:parameter) = dbk:parameter *
- + dbk:prompt (dbk:prompt) = dbk:prompt *
- + dbk:property (dbk:property) = dbk:property *
- + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
- + dbk:shortcut (dbk:shortcut) = dbk:shortcut *
- + dbk:systemitem (dbk:systemitem) = dbk:systemitem *
- + dbk:termdef (dbk:termdef) = dbk:termdef *
- + dbk:userinput (dbk:userinput) = dbk:userinput *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:varargs] > argeodbk:base, argeodbk:linkingAttributes
-
-[dbk:variablelist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
- + dbk:varlistentry (dbk:varlistentry) = dbk:varlistentry *
- - spacing (String) 
- - termlength (String) 
-
-[dbk:varlistentry] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:listitem (dbk:listitem) = dbk:listitem
- + dbk:term (dbk:term) = dbk:term *
-
-[dbk:varname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:videodata] > argeodbk:base
- + dbk:info (dbk:info) = dbk:info
- - align (String) 
- - contentdepth (String) 
- - contentwidth (String) 
- - depth (String) 
- - entityref (String) 
- - fileref (String) 
- - format (String) 
- - scale (String) 
- - scalefit (String) 
- - valign (String) 
- - width (String) 
-
-[dbk:videoobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:info (dbk:info) = dbk:info
- + dbk:videodata (dbk:videodata) = dbk:videodata
-
-[dbk:void] > argeodbk:base, argeodbk:linkingAttributes
-
-[dbk:volumenum] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:warning] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:bridgehead (dbk:bridgehead) = dbk:bridgehead *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:revhistory (dbk:revhistory) = dbk:revhistory *
- + dbk:screenshot (dbk:screenshot) = dbk:screenshot *
-
-[dbk:wordasword] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:xref] > argeodbk:base, argeodbk:linkingAttributes
- - endterm (Reference) 
- - xrefstyle (String) 
-
-[dbk:year] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-//[xs:anyType] > nt:base
-// + * (nt:base) 
-// + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-// - * (undefined) 
-
-
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/docbook.cnd b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/docbook.cnd
deleted file mode 100644 (file)
index 5514e64..0000000
+++ /dev/null
@@ -1,527 +0,0 @@
-<dbk = 'http://docbook.org/ns/docbook'>
-<argeodbk = 'http://www.argeo.org/ns/argeodbk'>
-<xlink = 'http://www.w3.org/1999/xlink'>
-
-[argeodbk:titled]
-mixin
- + dbk:info (dbk:info) = dbk:info *
- + dbk:title (dbk:title) = dbk:title *
-
-[argeodbk:linkingAttributes]
-mixin
- - linkend (String)
- - xlink:actuate (String)
- - xlink:arcrole (String)
- - xlink:href (String)
- - xlink:role (String)
- - xlink:show (String)
- - xlink:title (String)
- - xlink:type (String)
-
-[argeodbk:freeText]
-mixin
- + dbk:phrase (dbk:phrase) = dbk:phrase *
- + dbk:replaceable (dbk:replaceable) = dbk:replaceable *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[argeodbk:markupInlines]
-mixin
-
-[argeodbk:listElements]
-mixin
- + dbk:itemizedlist (dbk:itemizedlist) = dbk:itemizedlist *
- + dbk:orderedlist (dbk:orderedlist) = dbk:orderedlist *
- + dbk:simplelist (dbk:simplelist) = dbk:simplelist *
-
-[argeodbk:paragraphElements]
-mixin
- + dbk:para (dbk:para) = dbk:para *
-
-[argeodbk:indexingInlines]
-mixin
-
-[argeodbk:techDocElements]
-mixin
- + dbk:table (dbk:table) = dbk:table *
-
-[argeodbk:techDocInlines]
-mixin
-
-[argeodbk:publishingElements]
-mixin
-
-[argeodbk:ubiquitousInlines]
-mixin
- + dbk:alt (dbk:alt) = dbk:alt *
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:biblioref (dbk:biblioref) = dbk:biblioref *
- + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
- + dbk:link (dbk:link) = dbk:link *
- + dbk:olink (dbk:olink) = dbk:olink *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:subscript (dbk:subscript) = dbk:subscript *
- + dbk:superscript (dbk:superscript) = dbk:superscript *
- + dbk:xref (dbk:xref) = dbk:xref *
-
-[argeodbk:abstractSection]
-mixin
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:remark (dbk:remark) = dbk:remark *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String)
- - status (String)
-
-[argeodbk:bibliographyInlines]
-mixin
- + dbk:author (dbk:author) = dbk:author *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:personname (dbk:personname) = dbk:personname *
-
-[argeodbk:publishingInlines]
-mixin
- + dbk:emphasis (dbk:emphasis) = dbk:emphasis *
-
-[argeodbk:base]
-abstract
-orderable
- - annotations (String)
- - arch (String)
- - audience (String)
- - condition (String)
- - conformance (String)
- - dir (String)
- - os (String)
- - remap (String)
- - revision (String)
- - revisionflag (String)
- - role (String)
- - security (String)
- - userlevel (String)
- - vendor (String)
- - version (String)
- - wordsize (String)
- - xreflabel (String)
-
-[dbk:alt] > argeodbk:base
- + dbk:inlinemediaobject (dbk:inlinemediaobject) = dbk:inlinemediaobject *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
-
-[dbk:anchor] > argeodbk:base
-
-[dbk:annotation] > argeodbk:base, argeodbk:indexingInlines, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- - annotates (String) 
-
-[dbk:article] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:section (dbk:section) = dbk:section *
- - class (String) 
-
-[dbk:audiodata] > argeodbk:base
- + dbk:info (dbk:info) = dbk:info
- - entityref (String) 
- - fileref (String) 
- - format (String) 
-
-[dbk:audioobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:audiodata (dbk:audiodata) = dbk:audiodata
- + dbk:info (dbk:info) = dbk:info
-
-[dbk:author] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
- + dbk:orgname (dbk:orgname) = dbk:orgname
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname
-
-[dbk:biblioref] > argeodbk:base, argeodbk:linkingAttributes
- - begin (String) 
- - end (String) 
- - endterm (Reference) 
- - units (String) 
- - xrefstyle (String) 
-
-[dbk:book] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:article (dbk:article) = dbk:article *
- + dbk:chapter (dbk:chapter) = dbk:chapter *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:caption] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- + jcr:xmltext (jcrx:xmltext) = jcrx:xmltext *
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
-
-[dbk:chapter] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:section (dbk:section) = dbk:section *
-
-[dbk:colspec] > argeodbk:base, argeodbk:linkingAttributes
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colname (String) 
- - colnum (String) 
- - colsep (String) 
- - colwidth (String) 
- - rowsep (String) 
-
-[dbk:editor] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:orgdiv (dbk:orgdiv) = dbk:orgdiv *
- + dbk:orgname (dbk:orgname) = dbk:orgname
- + dbk:personblurb (dbk:personblurb) = dbk:personblurb *
- + dbk:personname (dbk:personname) = dbk:personname
-
-[dbk:emphasis] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:entry] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colname (String) 
- - colsep (String) 
- - morerows (String) 
- - nameend (String) 
- - namest (String) 
- - rotate (String) 
- - rowsep (String) 
- - spanname (String) 
- - valign (String) 
-
-[dbk:entrytbl] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
- + dbk:tbody (dbk:tbody) = dbk:tbody
- + dbk:thead (dbk:thead) = dbk:thead
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colname (String) 
- - cols (String) 
- - colsep (String) 
- - nameend (String) 
- - namest (String) 
- - rowsep (String) 
- - spanname (String) 
- - tgroupstyle (String) 
-
-[dbk:imagedata] > argeodbk:base
- + dbk:info (dbk:info) = dbk:info
- - align (String) 
- - contentdepth (String) 
- - contentwidth (String) 
- - depth (String) 
- - entityref (String) 
- - fileref (String) 
- - format (String) 
- - scale (String) 
- - scalefit (String) 
- - valign (String) 
- - width (String) 
-
-[dbk:imageobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:imagedata (dbk:imagedata) = dbk:imagedata
- + dbk:info (dbk:info) = dbk:info
-
-[dbk:info] > argeodbk:base
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:author (dbk:author) = dbk:author *
- + dbk:editor (dbk:editor) = dbk:editor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:orgname (dbk:orgname) = dbk:orgname *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- + dbk:title (dbk:title) = dbk:title *
- + * (nt:base) = nt:unstructured *
-
-[dbk:inlinemediaobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:alt (dbk:alt) = dbk:alt
- + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
- + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
- + dbk:info (dbk:info) = dbk:info
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
-
-[dbk:itemizedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:listitem (dbk:listitem) = dbk:listitem *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- - mark (String) 
- - spacing (String) 
-
-[dbk:link] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - endterm (Reference) 
- - xrefstyle (String) 
-
-[dbk:listitem] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- - override (String) 
-
-[dbk:mediaobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:alt (dbk:alt) = dbk:alt
- + dbk:audioobject (dbk:audioobject) = dbk:audioobject *
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:imageobject (dbk:imageobject) = dbk:imageobject *
- + dbk:info (dbk:info) = dbk:info
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- + dbk:videoobject (dbk:videoobject) = dbk:videoobject *
-
-[dbk:olink] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- - localinfo (String) 
- - targetdoc (String) 
- - targetptr (String) 
- - type (String) 
- - xrefstyle (String) 
-
-[dbk:orderedlist] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:listitem (dbk:listitem) = dbk:listitem *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:remark (dbk:remark) = dbk:remark *
- - continuation (String) 
- - inheritnum (String) 
- - numeration (String) 
- - spacing (String) 
- - startingnumber (String) 
-
-[dbk:orgdiv] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:orgname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
- - otherclass (String) 
-
-[dbk:para] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:markupInlines, argeodbk:publishingElements, argeodbk:publishingInlines, argeodbk:techDocElements, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
- + dbk:info (dbk:info) = dbk:info *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
-
-[dbk:personblurb] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:paragraphElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
-
-[dbk:personname] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:phrase] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:remark] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:replaceable] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
- - class (String) 
-
-[dbk:row] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:entry (dbk:entry) = dbk:entry *
- + dbk:entrytbl (dbk:entrytbl) = dbk:entrytbl *
- - rowsep (String) 
- - valign (String) 
-
-[dbk:section] > argeodbk:abstractSection, argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements, argeodbk:titled
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:section (dbk:section) = dbk:section *
-
-[dbk:set] > argeodbk:base, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:book (dbk:book) = dbk:book *
- + dbk:set (dbk:set) = dbk:set *
- + dbk:subtitle (dbk:subtitle) = dbk:subtitle *
- - label (String) 
- - status (String) 
-
-[dbk:simplelist] > argeodbk:base, argeodbk:linkingAttributes
- - columns (String) 
- - type (String) 
-
-[dbk:spanspec] > argeodbk:base, argeodbk:linkingAttributes
- - align (String) 
- - char (String) 
- - charoff (String) 
- - colsep (String) 
- - nameend (String) 
- - namest (String) 
- - rowsep (String) 
- - spanname (String) 
-
-[dbk:subscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:subtitle] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:superscript] > argeodbk:base, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:ubiquitousInlines
-
-[dbk:table] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:titled
- + dbk:caption (dbk:caption) = dbk:caption
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:tbody (dbk:tbody) = dbk:tbody *
- + dbk:textobject (dbk:textobject) = dbk:textobject *
- + dbk:tfoot (dbk:tfoot) = dbk:tfoot
- + dbk:tgroup (dbk:tgroup) = dbk:tgroup *
- + dbk:thead (dbk:thead) = dbk:thead
- - border (String) 
- - cellpadding (String) 
- - cellspacing (String) 
- - class (String) 
- - colsep (String) 
- - floatstyle (String) 
- - frame (String) 
- - label (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - orient (String) 
- - pgwide (String) 
- - rowheader (String) 
- - rowsep (String) 
- - rules (String) 
- - shortentry (String) 
- - style (String) 
- - summary (String) 
- - tabstyle (String) 
- - title (String) 
- - tocentry (String) 
- - width (String) 
-
-[dbk:tbody] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:row (dbk:row) = dbk:row *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
- - valign (String) 
-
-[dbk:textobject] > argeodbk:base, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:listElements, argeodbk:paragraphElements, argeodbk:publishingElements, argeodbk:techDocElements
- + dbk:anchor (dbk:anchor) = dbk:anchor *
- + dbk:annotation (dbk:annotation) = dbk:annotation *
- + dbk:info (dbk:info) = dbk:info
- + dbk:mediaobject (dbk:mediaobject) = dbk:mediaobject *
- + dbk:phrase (dbk:phrase) = dbk:phrase
- + dbk:remark (dbk:remark) = dbk:remark *
-
-[dbk:tfoot] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:row (dbk:row) = dbk:row *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
- - valign (String) 
-
-[dbk:tgroup] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:spanspec (dbk:spanspec) = dbk:spanspec *
- + dbk:tbody (dbk:tbody) = dbk:tbody
- + dbk:tfoot (dbk:tfoot) = dbk:tfoot
- + dbk:thead (dbk:thead) = dbk:thead
- - align (String) 
- - char (String) 
- - charoff (String) 
- - cols (String) 
- - colsep (String) 
- - rowsep (String) 
- - tgroupstyle (String) 
-
-[dbk:thead] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:colspec (dbk:colspec) = dbk:colspec *
- + dbk:row (dbk:row) = dbk:row *
- - align (String) 
- - char (String) 
- - charoff (String) 
- - class (String) 
- - lang (String) 
- - onclick (String) 
- - ondblclick (String) 
- - onkeydown (String) 
- - onkeypress (String) 
- - onkeyup (String) 
- - onmousedown (String) 
- - onmousemove (String) 
- - onmouseout (String) 
- - onmouseover (String) 
- - onmouseup (String) 
- - style (String) 
- - title (String) 
- - valign (String) 
-
-[dbk:title] > argeodbk:base, argeodbk:bibliographyInlines, argeodbk:freeText, argeodbk:indexingInlines, argeodbk:linkingAttributes, argeodbk:markupInlines, argeodbk:publishingInlines, argeodbk:techDocInlines, argeodbk:ubiquitousInlines
-
-[dbk:videodata] > argeodbk:base
- + dbk:info (dbk:info) = dbk:info
- - align (String) 
- - contentdepth (String) 
- - contentwidth (String) 
- - depth (String) 
- - entityref (String) 
- - fileref (String) 
- - format (String) 
- - scale (String) 
- - scalefit (String) 
- - valign (String) 
- - width (String) 
-
-[dbk:videoobject] > argeodbk:base, argeodbk:linkingAttributes
- + dbk:info (dbk:info) = dbk:info
- + dbk:videodata (dbk:videodata) = dbk:videodata
-
-[dbk:xref] > argeodbk:base, argeodbk:linkingAttributes
- - endterm (Reference) 
- - xrefstyle (String) 
-
-
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/AbstractDbkViewer.java
deleted file mode 100644 (file)
index 044b675..0000000
+++ /dev/null
@@ -1,993 +0,0 @@
-package org.argeo.docbook.ui;
-
-import static org.argeo.cms.ui.util.CmsUiUtils.fillWidth;
-import static org.argeo.docbook.DbkType.para;
-import static org.argeo.docbook.DbkUtils.addDbk;
-import static org.argeo.docbook.DbkUtils.isDbk;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Observer;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.text.Paragraph;
-import org.argeo.cms.text.TextInterpreter;
-import org.argeo.cms.text.TextSection;
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.AbstractPageViewer;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.viewers.NodePart;
-import org.argeo.cms.ui.viewers.PropertyPart;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.cms.ui.viewers.SectionPart;
-import org.argeo.cms.ui.widgets.EditableText;
-import org.argeo.cms.ui.widgets.StyledControl;
-import org.argeo.docbook.DbkAttr;
-import org.argeo.docbook.DbkType;
-import org.argeo.docbook.DbkUtils;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.rap.fileupload.FileDetails;
-import org.eclipse.rap.fileupload.FileUploadEvent;
-import org.eclipse.rap.fileupload.FileUploadHandler;
-import org.eclipse.rap.fileupload.FileUploadListener;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/** Base class for text viewers and editors. */
-public abstract class AbstractDbkViewer extends AbstractPageViewer implements KeyListener, Observer {
-       private static final long serialVersionUID = -2401274679492339668L;
-       private final static Log log = LogFactory.getLog(AbstractDbkViewer.class);
-
-       private final Section mainSection;
-
-       private TextInterpreter textInterpreter = new DbkTextInterpreter();
-       private DbkImageManager imageManager;
-
-       private FileUploadListener fileUploadListener;
-       private DbkContextMenu styledTools;
-
-       private final boolean flat;
-
-       private boolean showMainTitle = true;
-
-       private Integer maxMediaWidth = null;
-       private String defaultSectionStyle;
-
-       protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) {
-               super(parent, style, cmsEditable);
-//             CmsView cmsView = CmsView.getCmsView(parent);
-//             imageManager = cmsView.getImageManager();
-               flat = SWT.FLAT == (style & SWT.FLAT);
-
-               if (getCmsEditable().canEdit()) {
-                       fileUploadListener = new FUL();
-                       styledTools = new DbkContextMenu(this, parent.getShell());
-               }
-               this.mainSection = parent;
-               Node baseFolder = Jcr.getParent(mainSection.getNode());
-               imageManager = new DbkImageManager(baseFolder);
-               initModelIfNeeded(mainSection.getNode());
-               // layout(this.mainSection);
-       }
-
-       @Override
-       public Control getControl() {
-               return mainSection;
-       }
-
-       protected void refresh(Control control) throws RepositoryException {
-               if (!(control instanceof Section))
-                       return;
-               Section section = (Section) control;
-               if (section instanceof TextSection) {
-                       CmsUiUtils.clear(section);
-                       Node node = section.getNode();
-                       TextSection textSection = (TextSection) section;
-                       String style = node.hasProperty(DbkAttr.role.name()) ? node.getProperty(DbkAttr.role.name()).getString()
-                                       : getDefaultSectionStyle();
-                       if (style != null)
-                               CmsUiUtils.style(textSection, style);
-
-                       if (node.hasNode(DbkType.title.get())) {
-                               boolean showTitle = getMainSection() == section ? showMainTitle : true;
-                               if (showTitle) {
-                                       if (section.getHeader() == null)
-                                               section.createHeader();
-                                       Node titleNode = node.getNode(DbkType.title.get());
-                                       DocBookSectionTitle title = newSectionTitle(textSection, titleNode);
-                                       title.setLayoutData(CmsUiUtils.fillWidth());
-                                       updateContent(title);
-                               }
-                       }
-
-                       for (NodeIterator ni = node.getNodes(); ni.hasNext();) {
-                               Node child = ni.nextNode();
-                               SectionPart sectionPart = null;
-                               if (isDbk(child, DbkType.mediaobject)) {
-                                       sectionPart = newImg(textSection, child);
-//                                     if (child.hasNode(DbkType.imageobject.get())) {
-//                                             Node imageDataNode = child.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get());
-//                                             sectionPart = newImg(textSection, imageDataNode);
-//                                     }
-                               } else if (isDbk(child, para)) {
-                                       sectionPart = newParagraph(textSection, child);
-                               } else {
-                                       sectionPart = newSectionPart(textSection, child);
-//                                     if (sectionPart == null)
-//                                             throw new IllegalArgumentException("Unsupported node " + child);
-                                       // TODO list node types in exception
-                               }
-                               if (sectionPart != null && sectionPart instanceof Control)
-                                       ((Control) sectionPart).setLayoutData(CmsUiUtils.fillWidth());
-                       }
-
-//                     if (!flat)
-                       for (NodeIterator ni = section.getNode().getNodes(DbkType.section.get()); ni.hasNext();) {
-                               Node child = ni.nextNode();
-                               if (isDbk(child, DbkType.section)) {
-                                       TextSection newSection = newTextSection(section, child);
-                                       newSection.setLayoutData(CmsUiUtils.fillWidth());
-                                       refresh(newSection);
-                               }
-                       }
-               } else {
-                       for (Section s : section.getSubSections().values())
-                               refresh(s);
-               }
-               // section.layout(true, true);
-       }
-
-       /** To be overridden in order to provide additional SectionPart types */
-       protected TextSection newTextSection(Section section, Node node) {
-               return new TextSection(section, SWT.NONE, node);
-       }
-
-       /** To be overridden in order to provide additional SectionPart types */
-       protected SectionPart newSectionPart(TextSection textSection, Node node) {
-               return null;
-       }
-
-       // CRUD
-       protected Paragraph newParagraph(TextSection parent, Node node) throws RepositoryException {
-               Paragraph paragraph = new Paragraph(parent, parent.getStyle(), node);
-               updateContent(paragraph);
-               paragraph.setLayoutData(fillWidth());
-               paragraph.setMouseListener(getMouseListener());
-               paragraph.setFocusListener(getFocusListener());
-               return paragraph;
-       }
-
-       protected DbkImg newImg(TextSection parent, Node node) {
-               try {
-                       DbkImg img = new DbkImg(parent, parent.getStyle(), node, imageManager);
-                       GridData imgGd;
-                       if (maxMediaWidth != null) {
-                               imgGd = new GridData(SWT.CENTER, SWT.FILL, false, false);
-                               imgGd.widthHint = maxMediaWidth;
-                               img.setPreferredSize(new Point(maxMediaWidth, 0));
-                       } else {
-                               imgGd = CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT);
-                       }
-                       img.setLayoutData(imgGd);
-                       updateContent(img);
-                       img.setMouseListener(getMouseListener());
-                       img.setFocusListener(getFocusListener());
-                       return img;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot add new image " + node, e);
-               }
-       }
-
-       protected DocBookSectionTitle newSectionTitle(TextSection parent, Node titleNode) throws RepositoryException {
-               int style = parent.getStyle();
-               Composite titleParent = newSectionHeader(parent);
-               if (parent.isTitleReadOnly())
-                       style = style | SWT.READ_ONLY;
-               DocBookSectionTitle title = new DocBookSectionTitle(titleParent, style, titleNode);
-               updateContent(title);
-               title.setMouseListener(getMouseListener());
-               title.setFocusListener(getFocusListener());
-               return title;
-       }
-
-       /**
-        * To be overridden in order to provide additional processing at the section
-        * level.
-        * 
-        * @return the parent to use for the {@link DocBookSectionTitle}, by default
-        *         {@link Section#getHeader()}
-        */
-       protected Composite newSectionHeader(TextSection section) {
-               return section.getHeader();
-       }
-
-       protected DocBookSectionTitle prepareSectionTitle(Section newSection, String titleText) throws RepositoryException {
-               Node sectionNode = newSection.getNode();
-               Node titleNode = DbkUtils.getOrAddDbk(sectionNode, DbkType.title);
-               getTextInterpreter().write(titleNode, titleText);
-               if (newSection.getHeader() == null)
-                       newSection.createHeader();
-               DocBookSectionTitle sectionTitle = newSectionTitle((TextSection) newSection, sectionNode);
-               return sectionTitle;
-       }
-
-       protected void updateContent(EditablePart part) throws RepositoryException {
-               if (part instanceof SectionPart) {
-                       SectionPart sectionPart = (SectionPart) part;
-                       Node partNode = sectionPart.getNode();
-
-                       if (part instanceof StyledControl && (sectionPart.getSection() instanceof TextSection)) {
-                               TextSection section = (TextSection) sectionPart.getSection();
-                               StyledControl styledControl = (StyledControl) part;
-                               if (isDbk(partNode, para)) {
-                                       String style = partNode.hasProperty(DbkAttr.role.name())
-                                                       ? partNode.getProperty(DbkAttr.role.name()).getString()
-                                                       : section.getDefaultTextStyle();
-                                       styledControl.setStyle(style);
-                               }
-                       }
-                       // use control AFTER setting style, since it may have been reset
-
-                       if (part instanceof EditableText) {
-                               EditableText paragraph = (EditableText) part;
-                               if (paragraph == getEdited())
-                                       paragraph.setText(textInterpreter.raw(partNode));
-                               else
-                                       paragraph.setText(textInterpreter.readSimpleHtml(partNode));
-                       } else if (part instanceof DbkImg) {
-                               DbkImg editableImage = (DbkImg) part;
-                               imageManager.load(partNode, part.getControl(), editableImage.getPreferredImageSize());
-                       }
-               } else if (part instanceof DocBookSectionTitle) {
-                       DocBookSectionTitle title = (DocBookSectionTitle) part;
-                       title.setStyle(title.getSection().getTitleStyle());
-                       // use control AFTER setting style
-                       if (title == getEdited())
-                               title.setText(textInterpreter.read(title.getNode()));
-                       else
-                               title.setText(textInterpreter.raw(title.getNode()));
-               }
-       }
-
-       // OVERRIDDEN FROM PARENT VIEWER
-       @Override
-       protected void save(EditablePart part) throws RepositoryException {
-               if (part instanceof EditableText) {
-                       EditableText et = (EditableText) part;
-                       if (!et.getEditable())
-                               return;
-                       String text = ((Text) et.getControl()).getText();
-
-                       // String[] lines = text.split("[\r\n]+");
-                       String[] lines = { text };
-                       assert lines.length != 0;
-                       saveLine(part, lines[0]);
-                       if (lines.length > 1) {
-                               ArrayList<Control> toLayout = new ArrayList<Control>();
-                               if (part instanceof Paragraph) {
-                                       Paragraph currentParagraph = (Paragraph) et;
-                                       Section section = currentParagraph.getSection();
-                                       Node sectionNode = section.getNode();
-                                       Node currentParagraphN = currentParagraph.getNode();
-                                       for (int i = 1; i < lines.length; i++) {
-                                               Node newNode = addDbk(sectionNode, para);
-                                               // newNode.addMixin(CmsTypes.CMS_STYLED);
-                                               saveLine(newNode, lines[i]);
-                                               // second node was create as last, if it is not the next
-                                               // one, it
-                                               // means there are some in between and we can take the
-                                               // one at
-                                               // index+1 for the re-order
-                                               if (newNode.getIndex() > currentParagraphN.getIndex() + 1) {
-                                                       sectionNode.orderBefore(p(newNode.getIndex()), p(currentParagraphN.getIndex() + 1));
-                                               }
-                                               Paragraph newParagraph = newParagraph((TextSection) section, newNode);
-                                               newParagraph.moveBelow(currentParagraph);
-                                               toLayout.add(newParagraph);
-
-                                               currentParagraph = newParagraph;
-                                               currentParagraphN = newNode;
-                                       }
-                               }
-                               // TODO or rather return the created paragraphs?
-                               layout(toLayout.toArray(new Control[toLayout.size()]));
-                       }
-                       persistChanges(et.getNode());
-               }
-       }
-
-       protected void saveLine(EditablePart part, String line) {
-               if (part instanceof NodePart) {
-                       saveLine(((NodePart) part).getNode(), line);
-               } else if (part instanceof PropertyPart) {
-                       saveLine(((PropertyPart) part).getProperty(), line);
-               } else {
-                       throw new IllegalArgumentException("Unsupported part " + part);
-               }
-       }
-
-       protected void saveLine(Item item, String line) {
-               line = line.trim();
-               textInterpreter.write(item, line);
-       }
-
-       @Override
-       protected void prepare(EditablePart part, Object caretPosition) {
-               Control control = part.getControl();
-               if (control instanceof Text) {
-                       Text text = (Text) control;
-                       if (caretPosition != null)
-                               if (caretPosition instanceof Integer)
-                                       text.setSelection((Integer) caretPosition);
-                               else if (caretPosition instanceof Point) {
-//                                     layout(text);
-//                                     // TODO find a way to position the caret at the right place
-//                                     Point clickLocation = (Point) caretPosition;
-//                                     Point withinText = text.toControl(clickLocation);
-//                                     Rectangle bounds = text.getBounds();
-//                                     int width = bounds.width;
-//                                     int height = bounds.height;
-//                                     int textLength = text.getText().length();
-//                                     float area = width * height;
-//                                     float proportion = withinText.y * width + withinText.x;
-//                                     int pos = (int) (textLength * (proportion / area));
-//                                     text.setSelection(pos);
-                               }
-                       text.setData(RWT.ACTIVE_KEYS, new String[] { "BACKSPACE", "ESC", "TAB", "SHIFT+TAB", "ALT+ARROW_LEFT",
-                                       "ALT+ARROW_RIGHT", "ALT+ARROW_UP", "ALT+ARROW_DOWN", "RETURN", "CTRL+RETURN", "ENTER", "DELETE" });
-                       text.setData(RWT.CANCEL_KEYS, new String[] { "RETURN", "ALT+ARROW_LEFT", "ALT+ARROW_RIGHT" });
-                       text.addKeyListener(this);
-               } else if (part instanceof DbkImg) {
-                       ((DbkImg) part).setFileUploadListener(fileUploadListener);
-               }
-       }
-
-       // REQUIRED BY CONTEXT MENU
-       void setParagraphStyle(Paragraph paragraph, String style) {
-               try {
-                       Node paragraphNode = paragraph.getNode();
-                       if (style == null) {// default
-                               if (paragraphNode.hasProperty(DbkAttr.role.name()))
-                                       paragraphNode.getProperty(DbkAttr.role.name()).remove();
-                       } else {
-                               paragraphNode.setProperty(DbkAttr.role.name(), style);
-                       }
-                       persistChanges(paragraphNode);
-                       updateContent(paragraph);
-                       layoutPage();
-               } catch (RepositoryException e1) {
-                       throw new JcrException("Cannot set style " + style + " on " + paragraph, e1);
-               }
-       }
-
-       SectionPart insertPart(Section section, Node node) {
-               try {
-                       refresh(section);
-                       layoutPage();
-                       for (Control control : section.getChildren()) {
-                               if (control instanceof SectionPart) {
-                                       SectionPart sectionPart = (SectionPart) control;
-                                       Node partNode = sectionPart.getNode();
-                                       if (partNode.getPath().equals(node.getPath()))
-                                               return sectionPart;
-                               }
-                       }
-                       throw new IllegalStateException("New section part " + node + "not found");
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot insert part " + node + " in section " + section.getNode(), e);
-               }
-       }
-
-       void addParagraph(SectionPart partBefore, String txt) {
-               Section section = partBefore.getSection();
-               SectionPart nextSectionPart = section.nextSectionPart(partBefore);
-               Node newNode = addDbk(section.getNode(), para);
-               textInterpreter.write(newNode, txt != null ? txt : "");
-               if (nextSectionPart != null) {
-                       try {
-                               Node nextNode = nextSectionPart.getNode();
-                               section.getNode().orderBefore(Jcr.getIndexedName(newNode), Jcr.getIndexedName(nextNode));
-                       } catch (RepositoryException e) {
-                               throw new JcrException("Cannot order " + newNode + " before " + nextSectionPart.getNode(), e);
-                       }
-               }
-               Jcr.save(newNode);
-               Paragraph paragraph = (Paragraph) insertPart(partBefore.getSection(), newNode);
-               edit(paragraph, 0);
-       }
-
-       void deletePart(SectionPart sectionPart) {
-               try {
-                       Node node = sectionPart.getNode();
-                       Session session = node.getSession();
-                       if (sectionPart instanceof DbkImg) {
-                               if (!isDbk(node, DbkType.mediaobject))
-                                       throw new IllegalArgumentException("Node " + node + " is not a media object.");
-                       }
-                       node.remove();
-                       session.save();
-                       if (sectionPart instanceof Control)
-                               ((Control) sectionPart).dispose();
-                       layoutPage();
-               } catch (RepositoryException e1) {
-                       throw new JcrException("Cannot delete " + sectionPart, e1);
-               }
-       }
-
-       void deleteSection(Section section) {
-               try {
-                       Node node = section.getNode();
-                       Session session = node.getSession();
-                       node.remove();
-                       session.save();
-                       section.dispose();
-                       layoutPage();
-               } catch (RepositoryException e1) {
-                       throw new JcrException("Cannot delete " + section, e1);
-               }
-       }
-
-       String getRawParagraphText(Paragraph paragraph) {
-               return textInterpreter.raw(paragraph.getNode());
-       }
-
-       // COMMANDS
-       protected void splitEdit() {
-               checkEdited();
-               try {
-                       if (getEdited() instanceof Paragraph) {
-                               Paragraph paragraph = (Paragraph) getEdited();
-                               Text text = (Text) paragraph.getControl();
-                               int caretPosition = text.getCaretPosition();
-                               String txt = text.getText();
-                               String first = txt.substring(0, caretPosition);
-                               String second = txt.substring(caretPosition);
-                               Node firstNode = paragraph.getNode();
-                               Node sectionNode = firstNode.getParent();
-
-                               // FIXME set content the DocBook way
-                               // firstNode.setProperty(CMS_CONTENT, first);
-                               Node secondNode = addDbk(sectionNode, para);
-                               // secondNode.addMixin(CmsTypes.CMS_STYLED);
-
-                               // second node was create as last, if it is not the next one, it
-                               // means there are some in between and we can take the one at
-                               // index+1 for the re-order
-                               if (secondNode.getIndex() > firstNode.getIndex() + 1) {
-                                       sectionNode.orderBefore(p(secondNode.getIndex()), p(firstNode.getIndex() + 1));
-                               }
-
-                               // if we die in between, at least we still have the whole text
-                               // in the first node
-                               try {
-                                       textInterpreter.write(secondNode, second);
-                                       textInterpreter.write(firstNode, first);
-                               } catch (Exception e) {
-                                       // so that no additional nodes are created:
-                                       JcrUtils.discardUnderlyingSessionQuietly(firstNode);
-                                       throw e;
-                               }
-
-                               persistChanges(firstNode);
-
-                               Paragraph secondParagraph = paragraphSplitted(paragraph, secondNode);
-                               edit(secondParagraph, 0);
-                       } else if (getEdited() instanceof DocBookSectionTitle) {
-                               DocBookSectionTitle sectionTitle = (DocBookSectionTitle) getEdited();
-                               Text text = (Text) sectionTitle.getControl();
-                               String txt = text.getText();
-                               int caretPosition = text.getCaretPosition();
-                               Section section = sectionTitle.getSection();
-                               Node sectionNode = section.getNode();
-                               Node paragraphNode = addDbk(sectionNode, para);
-                               // paragraphNode.addMixin(CmsTypes.CMS_STYLED);
-
-                               textInterpreter.write(paragraphNode, txt.substring(caretPosition));
-                               textInterpreter.write(sectionNode.getNode(DbkType.title.get()), txt.substring(0, caretPosition));
-                               sectionNode.orderBefore(p(paragraphNode.getIndex()), p(1));
-                               persistChanges(sectionNode);
-
-                               Paragraph paragraph = sectionTitleSplitted(sectionTitle, paragraphNode);
-                               // section.layout();
-                               edit(paragraph, 0);
-                       }
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot split " + getEdited(), e);
-               }
-       }
-
-       protected void mergeWithPrevious() {
-               checkEdited();
-               try {
-                       Paragraph paragraph = (Paragraph) getEdited();
-                       Text text = (Text) paragraph.getControl();
-                       String txt = text.getText();
-                       Node paragraphNode = paragraph.getNode();
-                       if (paragraphNode.getIndex() == 1)
-                               return;// do nothing
-                       Node sectionNode = paragraphNode.getParent();
-                       Node previousNode = sectionNode.getNode(p(paragraphNode.getIndex() - 1));
-                       String previousTxt = textInterpreter.read(previousNode);
-                       textInterpreter.write(previousNode, previousTxt + txt);
-                       paragraphNode.remove();
-                       persistChanges(sectionNode);
-
-                       Paragraph previousParagraph = paragraphMergedWithPrevious(paragraph, previousNode);
-                       edit(previousParagraph, previousTxt.length());
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot stop editing", e);
-               }
-       }
-
-       protected void mergeWithNext() {
-               checkEdited();
-               try {
-                       Paragraph paragraph = (Paragraph) getEdited();
-                       Text text = (Text) paragraph.getControl();
-                       String txt = text.getText();
-                       Node paragraphNode = paragraph.getNode();
-                       Node sectionNode = paragraphNode.getParent();
-                       NodeIterator paragraphNodes = sectionNode.getNodes(DbkType.para.get());
-                       long size = paragraphNodes.getSize();
-                       if (paragraphNode.getIndex() == size)
-                               return;// do nothing
-                       Node nextNode = sectionNode.getNode(p(paragraphNode.getIndex() + 1));
-                       String nextTxt = textInterpreter.read(nextNode);
-                       textInterpreter.write(paragraphNode, txt + nextTxt);
-
-                       Section section = paragraph.getSection();
-                       Paragraph removed = (Paragraph) section.getSectionPart(nextNode.getIdentifier());
-
-                       nextNode.remove();
-                       persistChanges(sectionNode);
-
-                       paragraphMergedWithNext(paragraph, removed);
-                       edit(paragraph, txt.length());
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot stop editing", e);
-               }
-       }
-
-       protected synchronized void upload(EditablePart part) {
-               try {
-                       if (part instanceof SectionPart) {
-                               SectionPart sectionPart = (SectionPart) part;
-                               Node partNode = sectionPart.getNode();
-                               int partIndex = partNode.getIndex();
-                               Section section = sectionPart.getSection();
-                               Node sectionNode = section.getNode();
-
-                               if (part instanceof Paragraph) {
-                                       // FIXME adapt to DocBook
-//                                     Node newNode = sectionNode.addNode(DocBookNames.DBK_MEDIAOBJECT, NodeType.NT_FILE);
-//                                     newNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE);
-//                                     JcrUtils.copyBytesAsFile(sectionNode, p(newNode.getIndex()), new byte[0]);
-//                                     if (partIndex < newNode.getIndex() - 1) {
-//                                             // was not last
-//                                             sectionNode.orderBefore(p(newNode.getIndex()), p(partIndex - 1));
-//                                     }
-//                                     // sectionNode.orderBefore(p(partNode.getIndex()),
-//                                     // p(newNode.getIndex()));
-//                                     persistChanges(sectionNode);
-//                                     DbkImg img = newImg((TextSection) section, newNode);
-//                                     edit(img, null);
-//                                     layout(img.getControl());
-                               } else if (part instanceof DbkImg) {
-                                       if (getEdited() == part)
-                                               return;
-                                       edit(part, null);
-                                       layoutPage();
-                               }
-                       }
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot upload", e);
-               }
-       }
-
-       protected void deepen() {
-               if (flat)
-                       return;
-               checkEdited();
-               try {
-                       if (getEdited() instanceof Paragraph) {
-                               Paragraph paragraph = (Paragraph) getEdited();
-                               Text text = (Text) paragraph.getControl();
-                               String txt = text.getText();
-                               Node paragraphNode = paragraph.getNode();
-                               Section section = paragraph.getSection();
-                               Node sectionNode = section.getNode();
-                               // main title
-                               if (section == mainSection && section instanceof TextSection && paragraphNode.getIndex() == 1
-                                               && !sectionNode.hasNode(DbkType.title.get())) {
-                                       DocBookSectionTitle sectionTitle = prepareSectionTitle(section, txt);
-                                       edit(sectionTitle, 0);
-                                       return;
-                               }
-                               Node newSectionNode = addDbk(sectionNode, DbkType.section);
-                               // newSectionNode.addMixin(NodeType.MIX_TITLE);
-                               sectionNode.orderBefore(h(newSectionNode.getIndex()), h(1));
-
-                               int paragraphIndex = paragraphNode.getIndex();
-                               String sectionPath = sectionNode.getPath();
-                               String newSectionPath = newSectionNode.getPath();
-                               while (sectionNode.hasNode(p(paragraphIndex + 1))) {
-                                       Node parag = sectionNode.getNode(p(paragraphIndex + 1));
-                                       sectionNode.getSession().move(sectionPath + '/' + p(paragraphIndex + 1),
-                                                       newSectionPath + '/' + DbkType.para.get());
-                                       SectionPart sp = section.getSectionPart(parag.getIdentifier());
-                                       if (sp instanceof Control)
-                                               ((Control) sp).dispose();
-                               }
-                               // create title
-                               Node titleNode = DbkUtils.addDbk(newSectionNode, DbkType.title);
-                               // newSectionNode.addNode(DocBookType.TITLE, DocBookType.TITLE);
-                               getTextInterpreter().write(titleNode, txt);
-
-                               TextSection newSection = new TextSection(section, section.getStyle(), newSectionNode);
-                               newSection.setLayoutData(CmsUiUtils.fillWidth());
-                               newSection.moveBelow(paragraph);
-
-                               // dispose
-                               paragraphNode.remove();
-                               paragraph.dispose();
-
-                               refresh(newSection);
-                               newSection.getParent().layout();
-                               layout(newSection);
-                               persistChanges(sectionNode);
-                       } else if (getEdited() instanceof DocBookSectionTitle) {
-                               DocBookSectionTitle sectionTitle = (DocBookSectionTitle) getEdited();
-                               Section section = sectionTitle.getSection();
-                               Section parentSection = section.getParentSection();
-                               if (parentSection == null)
-                                       return;// cannot deepen main section
-                               Node sectionN = section.getNode();
-                               Node parentSectionN = parentSection.getNode();
-                               if (sectionN.getIndex() == 1)
-                                       return;// cannot deepen first section
-                               Node previousSectionN = parentSectionN.getNode(h(sectionN.getIndex() - 1));
-                               NodeIterator subSections = previousSectionN.getNodes(DbkType.section.get());
-                               int subsectionsCount = (int) subSections.getSize();
-                               previousSectionN.getSession().move(sectionN.getPath(),
-                                               previousSectionN.getPath() + "/" + h(subsectionsCount + 1));
-                               section.dispose();
-                               TextSection newSection = new TextSection(section, section.getStyle(), sectionN);
-                               refresh(newSection);
-                               persistChanges(previousSectionN);
-                       }
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot deepen " + getEdited(), e);
-               }
-       }
-
-       protected void undeepen() {
-               if (flat)
-                       return;
-               checkEdited();
-               try {
-                       if (getEdited() instanceof Paragraph) {
-                               upload(getEdited());
-                       } else if (getEdited() instanceof DocBookSectionTitle) {
-                               DocBookSectionTitle sectionTitle = (DocBookSectionTitle) getEdited();
-                               Section section = sectionTitle.getSection();
-                               Node sectionNode = section.getNode();
-                               Section parentSection = section.getParentSection();
-                               if (parentSection == null)
-                                       return;// cannot undeepen main section
-
-                               // choose in which section to merge
-                               Section mergedSection;
-                               if (sectionNode.getIndex() == 1)
-                                       mergedSection = section.getParentSection();
-                               else {
-                                       Map<String, Section> parentSubsections = parentSection.getSubSections();
-                                       ArrayList<Section> lst = new ArrayList<Section>(parentSubsections.values());
-                                       mergedSection = lst.get(sectionNode.getIndex() - 1);
-                               }
-                               Node mergedNode = mergedSection.getNode();
-                               boolean mergedHasSubSections = mergedNode.hasNode(DbkType.section.get());
-
-                               // title as paragraph
-                               Node newParagrapheNode = addDbk(mergedNode, para);
-                               // newParagrapheNode.addMixin(CmsTypes.CMS_STYLED);
-                               if (mergedHasSubSections)
-                                       mergedNode.orderBefore(p(newParagrapheNode.getIndex()), h(1));
-                               String txt = getTextInterpreter().read(sectionNode.getNode(DbkType.title.get()));
-                               getTextInterpreter().write(newParagrapheNode, txt);
-                               // move
-                               NodeIterator paragraphs = sectionNode.getNodes(para.get());
-                               while (paragraphs.hasNext()) {
-                                       Node p = paragraphs.nextNode();
-                                       SectionPart sp = section.getSectionPart(p.getIdentifier());
-                                       if (sp instanceof Control)
-                                               ((Control) sp).dispose();
-                                       mergedNode.getSession().move(p.getPath(), mergedNode.getPath() + '/' + para.get());
-                                       if (mergedHasSubSections)
-                                               mergedNode.orderBefore(p(p.getIndex()), h(1));
-                               }
-
-                               Iterator<Section> subsections = section.getSubSections().values().iterator();
-                               // NodeIterator sections = sectionNode.getNodes(CMS_H);
-                               while (subsections.hasNext()) {
-                                       Section subsection = subsections.next();
-                                       Node s = subsection.getNode();
-                                       mergedNode.getSession().move(s.getPath(), mergedNode.getPath() + '/' + DbkType.section.get());
-                                       subsection.dispose();
-                               }
-
-                               // remove section
-                               section.getNode().remove();
-                               section.dispose();
-
-                               refresh(mergedSection);
-                               mergedSection.getParent().layout();
-                               layout(mergedSection);
-                               persistChanges(mergedNode);
-                       }
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot undeepen " + getEdited(), e);
-               }
-       }
-
-       // UI CHANGES
-       protected Paragraph paragraphSplitted(Paragraph paragraph, Node newNode) throws RepositoryException {
-               Section section = paragraph.getSection();
-               updateContent(paragraph);
-               Paragraph newParagraph = newParagraph((TextSection) section, newNode);
-               newParagraph.setLayoutData(CmsUiUtils.fillWidth());
-               newParagraph.moveBelow(paragraph);
-               layout(paragraph.getControl(), newParagraph.getControl());
-               return newParagraph;
-       }
-
-       protected Paragraph sectionTitleSplitted(DocBookSectionTitle sectionTitle, Node newNode)
-                       throws RepositoryException {
-               updateContent(sectionTitle);
-               Paragraph newParagraph = newParagraph(sectionTitle.getSection(), newNode);
-               // we assume beforeFirst is not null since there was a sectionTitle
-               newParagraph.moveBelow(sectionTitle.getSection().getHeader());
-               layout(sectionTitle.getControl(), newParagraph.getControl());
-               return newParagraph;
-       }
-
-       protected Paragraph paragraphMergedWithPrevious(Paragraph removed, Node remaining) throws RepositoryException {
-               Section section = removed.getSection();
-               removed.dispose();
-
-               Paragraph paragraph = (Paragraph) section.getSectionPart(remaining.getIdentifier());
-               updateContent(paragraph);
-               layout(paragraph.getControl());
-               return paragraph;
-       }
-
-       protected void paragraphMergedWithNext(Paragraph remaining, Paragraph removed) throws RepositoryException {
-               removed.dispose();
-               updateContent(remaining);
-               layout(remaining.getControl());
-       }
-
-       // UTILITIES
-       protected String p(Integer index) {
-               StringBuilder sb = new StringBuilder(6);
-               sb.append(para.get()).append('[').append(index).append(']');
-               return sb.toString();
-       }
-
-       protected String h(Integer index) {
-               StringBuilder sb = new StringBuilder(5);
-               sb.append(DbkType.section.get()).append('[').append(index).append(']');
-               return sb.toString();
-       }
-
-       // GETTERS / SETTERS
-       public Section getMainSection() {
-               return mainSection;
-       }
-
-       public boolean isFlat() {
-               return flat;
-       }
-
-       public TextInterpreter getTextInterpreter() {
-               return textInterpreter;
-       }
-
-       // KEY LISTENER
-       @Override
-       public void keyPressed(KeyEvent ke) {
-               if (log.isTraceEnabled())
-                       log.trace(ke);
-
-               if (getEdited() == null)
-                       return;
-               boolean altPressed = (ke.stateMask & SWT.ALT) != 0;
-               boolean shiftPressed = (ke.stateMask & SWT.SHIFT) != 0;
-               boolean ctrlPressed = (ke.stateMask & SWT.CTRL) != 0;
-
-               try {
-                       // Common
-                       if (ke.keyCode == SWT.ESC) {
-//                             cancelEdit();
-                               saveEdit();
-                       } else if (ke.character == '\r') {
-                               if (!shiftPressed)
-                                       splitEdit();
-                       } else if (ke.character == 'z') {
-                               if (ctrlPressed)
-                                       cancelEdit();
-                       } else if (ke.character == 'S') {
-                               if (ctrlPressed)
-                                       saveEdit();
-                       } else if (ke.character == '\t') {
-                               if (!shiftPressed) {
-                                       deepen();
-                               } else if (shiftPressed) {
-                                       undeepen();
-                               }
-                       } else {
-                               if (getEdited() instanceof Paragraph) {
-                                       Paragraph paragraph = (Paragraph) getEdited();
-                                       Section section = paragraph.getSection();
-                                       if (altPressed && ke.keyCode == SWT.ARROW_RIGHT) {
-                                               edit(section.nextSectionPart(paragraph), 0);
-                                       } else if (altPressed && ke.keyCode == SWT.ARROW_LEFT) {
-                                               edit(section.previousSectionPart(paragraph), 0);
-                                       } else if (ke.character == SWT.BS) {
-                                               Text text = (Text) paragraph.getControl();
-                                               int caretPosition = text.getCaretPosition();
-                                               if (caretPosition == 0) {
-                                                       mergeWithPrevious();
-                                               }
-                                       } else if (ke.character == SWT.DEL) {
-                                               Text text = (Text) paragraph.getControl();
-                                               int caretPosition = text.getCaretPosition();
-                                               int charcount = text.getCharCount();
-                                               if (caretPosition == charcount) {
-                                                       mergeWithNext();
-                                               }
-                                       }
-                               }
-                       }
-               } catch (Exception e) {
-                       ke.doit = false;
-                       notifyEditionException(e);
-               }
-       }
-
-       @Override
-       public void keyReleased(KeyEvent e) {
-       }
-
-       // MOUSE LISTENER
-       @Override
-       protected MouseListener createMouseListener() {
-               return new ML();
-       }
-
-       private class ML extends MouseAdapter {
-               private static final long serialVersionUID = 8526890859876770905L;
-
-               @Override
-               public void mouseDoubleClick(MouseEvent e) {
-                       if (e.button == 1) {
-                               Control source = (Control) e.getSource();
-                               EditablePart composite = findDataParent(source);
-                               Point point = new Point(e.x, e.y);
-                               if (composite instanceof DbkImg) {
-                                       if (getCmsEditable().canEdit()) {
-                                               if (getCmsEditable().isEditing() && !(getEdited() instanceof DbkImg)) {
-                                                       if (source == mainSection)
-                                                               return;
-                                                       EditablePart part = findDataParent(source);
-                                                       upload(part);
-                                               } else {
-                                                       getCmsEditable().startEditing();
-                                               }
-                                       }
-                               } else if (source instanceof Label) {
-                                       Label lbl = (Label) source;
-                                       Rectangle bounds = lbl.getBounds();
-                                       float width = bounds.width;
-                                       float height = bounds.height;
-                                       float textLength = lbl.getText().length();
-                                       float area = width * height;
-                                       float charArea = area / textLength;
-                                       float lines = textLength / width;
-                                       float proportion = point.y * width + point.x;
-                                       int pos = (int) (textLength * (proportion / area));
-                                       // TODO refine it
-                                       edit(composite, (Integer) pos);
-                               } else {
-                                       edit(composite, source.toDisplay(point));
-                               }
-                       }
-               }
-
-               @Override
-               public void mouseDown(MouseEvent e) {
-                       if (getCmsEditable().isEditing()) {
-                               if (e.button == 3) {
-                                       EditablePart composite = findDataParent((Control) e.getSource());
-                                       if (styledTools != null) {
-                                               List<String> styles = getAvailableStyles(composite);
-                                               styledTools.show(composite, new Point(e.x, e.y), styles);
-                                       }
-                               }
-                       }
-               }
-
-               @Override
-               public void mouseUp(MouseEvent e) {
-               }
-       }
-
-       protected List<String> getAvailableStyles(EditablePart editablePart) {
-               return new ArrayList<>();
-       }
-
-       public void setMaxMediaWidth(Integer maxMediaWidth) {
-               this.maxMediaWidth = maxMediaWidth;
-       }
-
-       public void setShowMainTitle(boolean showMainTitle) {
-               this.showMainTitle = showMainTitle;
-       }
-
-       public String getDefaultSectionStyle() {
-               return defaultSectionStyle;
-       }
-
-       public void setDefaultSectionStyle(String defaultSectionStyle) {
-               this.defaultSectionStyle = defaultSectionStyle;
-       }
-
-       // FILE UPLOAD LISTENER
-       private class FUL implements FileUploadListener {
-               public void uploadProgress(FileUploadEvent event) {
-                       // TODO Monitor upload progress
-               }
-
-               public void uploadFailed(FileUploadEvent event) {
-                       throw new RuntimeException("Upload failed " + event, event.getException());
-               }
-
-               public void uploadFinished(FileUploadEvent event) {
-                       for (FileDetails file : event.getFileDetails()) {
-                               if (log.isDebugEnabled())
-                                       log.debug("Received: " + file.getFileName());
-                       }
-                       mainSection.getDisplay().syncExec(new Runnable() {
-                               @Override
-                               public void run() {
-                                       saveEdit();
-                               }
-                       });
-                       FileUploadHandler uploadHandler = (FileUploadHandler) event.getSource();
-                       uploadHandler.dispose();
-               }
-       }
-}
\ No newline at end of file
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/CustomDbkEditor.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/CustomDbkEditor.java
deleted file mode 100644 (file)
index 561b1e1..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.argeo.docbook.ui;
-
-import javax.jcr.Node;
-
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.viewers.Section;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Manages hardcoded sections as an arbitrary hierarchy under the main section,
- * which contains no text and no title.
- */
-public class CustomDbkEditor extends AbstractDbkViewer {
-       private static final long serialVersionUID = 656302500183820802L;
-
-       public CustomDbkEditor(Composite parent, int style, Node textNode, CmsEditable cmsEditable) {
-               this(new Section(parent, style, textNode), style, cmsEditable);
-       }
-
-       public CustomDbkEditor(Section parent, int style, CmsEditable cmsEditable) {
-               super(parent, style, cmsEditable);
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkContextMenu.java
deleted file mode 100644 (file)
index 77248d6..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-package org.argeo.docbook.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Node;
-
-import org.argeo.cms.text.Paragraph;
-import org.argeo.cms.text.TextSection;
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.viewers.NodePart;
-import org.argeo.cms.ui.viewers.Section;
-import org.argeo.cms.ui.viewers.SectionPart;
-import org.argeo.cms.ui.widgets.EditableText;
-import org.argeo.cms.ui.widgets.Img;
-import org.argeo.docbook.DbkMsg;
-import org.argeo.docbook.DbkUtils;
-import org.argeo.eclipse.ui.MouseDown;
-import org.argeo.jcr.Jcr;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/** Dialog to edit a text part. */
-class DbkContextMenu {
-       private final AbstractDbkViewer textViewer;
-
-       private Shell shell;
-
-       DbkContextMenu(AbstractDbkViewer textViewer, Shell parentShell) {
-//             shell = new Shell(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
-               shell = new Shell(parentShell, SWT.BORDER);
-//             super(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
-               this.textViewer = textViewer;
-               shell.setLayout(new GridLayout());
-               // shell.setData(RWT.CUSTOM_VARIANT, TEXT_STYLED_TOOLS_DIALOG);
-
-               shell.addShellListener(new ToolsShellListener());
-       }
-
-       void show(EditablePart editablePart, Point location, List<String> availableStyles) {
-               if (shell.isVisible())
-                       shell.setVisible(false);
-               CmsUiUtils.clear(shell);
-               Composite parent = shell;
-               CmsEditable cmsEditable = textViewer.getCmsEditable();
-//             if (availableStyles.isEmpty())
-//                     return;
-
-               if (editablePart instanceof Paragraph) {
-                       Paragraph paragraph = (Paragraph) editablePart;
-                       deletePartB(parent, DbkMsg.deleteParagraph.lead(), paragraph);
-                       insertMediaB(parent, DbkMsg.insertMedia.lead(), paragraph);
-
-               } else if (editablePart instanceof Img) {
-                       Img img = (Img) editablePart;
-                       deletePartB(parent, DbkMsg.deleteMedia.lead(), img);
-                       insertMediaB(parent, DbkMsg.insertMedia.lead(), img);
-                       insertParagraphB(parent, DbkMsg.insertParagraph.lead(), img);
-
-               } else if (editablePart instanceof DocBookSectionTitle) {
-                       DocBookSectionTitle sectionTitle = (DocBookSectionTitle) editablePart;
-                       TextSection section = sectionTitle.getSection();
-                       if (!section.isTitleReadOnly()) {
-                               Label deleteB = new Label(shell, SWT.NONE);
-                               deleteB.setText(DbkMsg.deleteSection.lead());
-                               deleteB.addMouseListener((MouseDown) (e) -> {
-                                       textViewer.deleteSection(section);
-                                       hide();
-                               });
-                       }
-                       insertMediaB(parent, DbkMsg.insertMedia.lead(), sectionTitle.getSection(), sectionTitle);
-               }
-
-               StyledToolMouseListener stml = new StyledToolMouseListener(editablePart);
-               List<StyleButton> styleButtons = new ArrayList<DbkContextMenu.StyleButton>();
-               if (cmsEditable.isEditing()) {
-                       for (String style : availableStyles) {
-                               StyleButton styleButton = new StyleButton(shell, SWT.WRAP);
-                               if (!"".equals(style))
-                                       styleButton.setStyle(style);
-                               else
-                                       styleButton.setStyle(null);
-                               styleButton.setMouseListener(stml);
-                               styleButtons.add(styleButton);
-                       }
-               } else if (cmsEditable.canEdit()) {
-                       // Edit
-//                     Label editButton = new Label(shell, SWT.NONE);
-//                     editButton.setText("Edit");
-//                     editButton.addMouseListener(stml);
-               }
-
-               if (editablePart instanceof Paragraph) {
-                       final int size = 32;
-                       String text = textViewer.getRawParagraphText((Paragraph) editablePart);
-                       String textToShow = text.length() > size ? text.substring(0, size - 3) + "..." : text;
-                       for (StyleButton styleButton : styleButtons) {
-                               styleButton.setText((styleButton.style == null ? "default" : styleButton.style) + " : " + textToShow);
-                       }
-               }
-
-               shell.pack();
-               shell.layout();
-               if (editablePart instanceof Control) {
-                       int height = shell.getSize().y;
-                       int parentShellHeight = shell.getShell().getSize().y;
-                       if ((location.y + height) < parentShellHeight) {
-                               shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y));
-                       } else {
-                               shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y - parentShellHeight));
-                       }
-               }
-
-               if (shell.getChildren().length != 0)
-                       shell.open();
-       }
-
-       void hide() {
-               shell.setVisible(false);
-       }
-
-       protected void insertMediaB(Composite parent, String msg, SectionPart sectionPart) {
-               insertMediaB(parent, msg, sectionPart.getSection(), sectionPart);
-       }
-
-       protected void insertMediaB(Composite parent, String msg, Section section, NodePart nodePart) {
-               Label insertMediaB = new Label(parent, SWT.NONE);
-               insertMediaB.setText(DbkMsg.insertMedia.lead());
-               insertMediaB.addMouseListener((MouseDown) (e) -> {
-                       Node newNode = DbkUtils.insertImageAfter(nodePart.getNode());
-                       Jcr.save(newNode);
-                       textViewer.insertPart(section, newNode);
-                       hide();
-               });
-
-       }
-
-       protected void insertParagraphB(Composite parent, String msg, SectionPart sectionPart) {
-               Label insertMediaB = new Label(parent, SWT.NONE);
-               insertMediaB.setText(msg);
-               insertMediaB.addMouseListener((MouseDown) (e) -> {
-                       textViewer.addParagraph(sectionPart, null);
-                       hide();
-               });
-       }
-
-       protected void deletePartB(Composite parent, String msg, SectionPart sectionPart) {
-               Label deleteB = new Label(shell, SWT.NONE);
-               deleteB.setText(msg);
-               deleteB.addMouseListener((MouseDown) (e) -> {
-                       textViewer.deletePart(sectionPart);
-                       hide();
-               });
-       }
-
-       class StyleButton extends EditableText {
-               private static final long serialVersionUID = 7731102609123946115L;
-
-               String style;
-
-               public StyleButton(Composite parent, int style) {
-                       super(parent, style);
-               }
-
-               @Override
-               public void setStyle(String style) {
-                       this.style = style;
-                       super.setStyle(style);
-               }
-
-//             private Label label;
-//
-//             public StyleButton(Composite parent, int swtStyle) {
-//                     super(parent, SWT.NONE);
-//                     setLayout(new GridLayout());
-//                     label = new Label(this, swtStyle);
-//             }
-//
-//             public Label getLabel() {
-//                     return label;
-//             }
-
-       }
-
-       class StyledToolMouseListener extends MouseAdapter {
-               private static final long serialVersionUID = 8516297091549329043L;
-               private EditablePart editablePart;
-
-               public StyledToolMouseListener(EditablePart editablePart) {
-                       super();
-                       this.editablePart = editablePart;
-               }
-
-               @Override
-               public void mouseDown(MouseEvent e) {
-                       // TODO make it more robust.
-                       Label sb = (Label) e.getSource();
-                       Object style = sb.getData(RWT.CUSTOM_VARIANT);
-                       textViewer.setParagraphStyle((Paragraph) editablePart, style == null ? null : style.toString());
-                       hide();
-               }
-       }
-
-       class ToolsShellListener extends org.eclipse.swt.events.ShellAdapter {
-               private static final long serialVersionUID = 8432350564023247241L;
-
-               @Override
-               public void shellDeactivated(ShellEvent e) {
-                       hide();
-               }
-
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImageManager.java
deleted file mode 100644 (file)
index 008ac76..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-package org.argeo.docbook.ui;
-
-import static javax.jcr.Node.JCR_CONTENT;
-import static javax.jcr.Property.JCR_DATA;
-import static javax.jcr.nodetype.NodeType.NT_FILE;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-
-import javax.jcr.Binary;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.NodeType;
-
-import org.argeo.cms.ui.CmsImageManager;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.util.DefaultImageManager;
-import org.argeo.docbook.DbkUtils;
-import org.argeo.docbook.DbkAttr;
-import org.argeo.docbook.DbkType;
-import org.argeo.entity.EntityNames;
-import org.argeo.entity.EntityType;
-import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrUtils;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-
-/** Add DocBook images support to {@link CmsImageManager}. */
-public class DbkImageManager extends DefaultImageManager {
-       private Node baseFolder = null;
-
-       public DbkImageManager(Node baseFolder) {
-               this.baseFolder = baseFolder;
-       }
-
-       Node getImageDataNode(Node mediaObjectNode) throws RepositoryException {
-               if (mediaObjectNode.hasNode(DbkType.imageobject.get())) {
-                       Node imageDataNode = mediaObjectNode.getNode(DbkType.imageobject.get()).getNode(DbkType.imagedata.get());
-                       return imageDataNode;
-               } else {
-                       throw new IllegalStateException("No image data found for " + mediaObjectNode);
-               }
-       }
-
-       @Override
-       public Binary getImageBinary(Node node) throws RepositoryException {
-               Node fileNode = null;
-               if (DbkUtils.isDbk(node, DbkType.mediaobject)) {
-                       Node imageDataNode = getImageDataNode(node);
-                       fileNode = getFileNode(imageDataNode);
-               }
-               if (node.isNodeType(NT_FILE)) {
-                       fileNode = node;
-               }
-               if (fileNode != null) {
-                       return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
-               } else {
-                       return null;
-               }
-       }
-
-       public Point getImageSize(Node mediaObjectNode) throws RepositoryException {
-               Node imageDataNode = getImageDataNode(mediaObjectNode);
-               Node fileNode = getFileNode(imageDataNode);
-               if (fileNode == null)
-                       return new Point(0, 0);
-               Point intrinsicSize;
-               if (fileNode.hasProperty(EntityNames.SVG_WIDTH) && fileNode.hasProperty(EntityNames.SVG_HEIGHT)) {
-                       int width = (int) fileNode.getProperty(EntityNames.SVG_WIDTH).getLong();
-                       int height = (int) fileNode.getProperty(EntityNames.SVG_HEIGHT).getLong();
-                       intrinsicSize = new Point(width, height);
-               } else {
-                       try (InputStream in = JcrUtils.getFileAsStream(fileNode)) {
-                               ImageData id = new ImageData(in);
-                               intrinsicSize = updateSize(fileNode, id);
-                       } catch (IOException e) {
-                               throw new RuntimeException("Cannot load file " + fileNode, e);
-                       }
-               }
-               // TODO interpret image data infos
-               return intrinsicSize;
-       }
-
-       protected Point updateSize(Node fileNode, ImageData id) throws RepositoryException {
-               fileNode.addMixin(EntityType.box.get());
-               fileNode.setProperty(EntityNames.SVG_WIDTH, id.width);
-               fileNode.setProperty(EntityNames.SVG_HEIGHT, id.height);
-               return new Point(id.width, id.height);
-       }
-
-       @Override
-       protected void processNewImageFile(Node mediaObjectNode, Node fileNode, ImageData id)
-                       throws RepositoryException, IOException {
-               Node imageDataNode = getImageDataNode(mediaObjectNode);
-               updateSize(fileNode, id);
-               String filePath = fileNode.getPath();
-               String relPath = filePath.substring(baseFolder.getPath().length() + 1);
-               imageDataNode.setProperty(DbkAttr.fileref.name(), relPath);
-       }
-
-       @Override
-       public String getImageUrl(Node mediaObjectNode) throws RepositoryException {
-               Node imageDataNode = getImageDataNode(mediaObjectNode);
-               // TODO factorise
-               String fileref = null;
-               if (imageDataNode.hasProperty(DbkAttr.fileref.name()))
-                       fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString();
-               if (fileref == null)
-                       return null;
-               URI fileUri;
-               try {
-                       fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString()));
-               } catch (URISyntaxException | UnsupportedEncodingException e) {
-                       throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e);
-               }
-               if (fileUri.getScheme() != null)
-                       return fileUri.toString();
-               // local
-               Node fileNode = getFileNode(imageDataNode);
-               String url = CmsUiUtils.getDataPath(fileNode);
-               return url;
-       }
-
-       protected Node getFileNode(Node imageDataNode) throws RepositoryException {
-               // FIXME make URL use case more robust
-               String fileref = null;
-               if (imageDataNode.hasProperty(DbkAttr.fileref.name()))
-                       fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString();
-               if (fileref == null)
-                       return null;
-               Node fileNode;
-               if (fileref.startsWith("/"))
-                       fileNode = baseFolder.getSession().getNode(fileref);
-               else
-                       fileNode = baseFolder.getNode(fileref);
-               return fileNode;
-       }
-
-       protected Node getMediaFolder() {
-               try {
-                       // TODO check edition status
-                       Node mediaFolder = JcrUtils.getOrAdd(baseFolder, EntityNames.MEDIA, NodeType.NT_FOLDER);
-                       return mediaFolder;
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot get media folder", e);
-               }
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImg.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkImg.java
deleted file mode 100644 (file)
index cb4ce2e..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.argeo.docbook.ui;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.widgets.Img;
-import org.eclipse.rap.fileupload.FileUploadEvent;
-import org.eclipse.rap.fileupload.FileUploadHandler;
-import org.eclipse.rap.fileupload.FileUploadListener;
-import org.eclipse.rap.fileupload.FileUploadReceiver;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** DocBook specific image area. */
-public class DbkImg extends Img {
-       private static final long serialVersionUID = -6150996708899219074L;
-
-       public DbkImg(Composite parent, int swtStyle, Node imgNode, DbkImageManager imageManager)
-                       throws RepositoryException {
-               super(parent, swtStyle, imgNode, imageManager);
-       }
-
-       @Override
-       protected Node getUploadFolder() {
-               Node mediaFolder = ((DbkImageManager) getImageManager()).getMediaFolder();
-               return mediaFolder;
-       }
-
-       @Override
-       protected String getUploadName() {
-               return null;
-       }
-
-       @Override
-       protected void setContainerLayoutData(Composite composite) {
-               composite.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
-       }
-
-       @Override
-       protected void setControlLayoutData(Control control) {
-               control.setLayoutData(CmsUiUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
-       }
-
-       @Override
-       protected FileUploadHandler prepareUpload(FileUploadReceiver receiver) {
-               FileUploadHandler fileUploadHandler = super.prepareUpload(receiver);
-               fileUploadHandler.addUploadListener(new FileUploadListener() {
-
-                       @Override
-                       public void uploadProgress(FileUploadEvent event) {
-                               // TODO Auto-generated method stub
-
-                       }
-
-                       @Override
-                       public void uploadFinished(FileUploadEvent event) {
-                       }
-
-                       @Override
-                       public void uploadFailed(FileUploadEvent event) {
-                               // TODO Auto-generated method stub
-
-                       }
-               });
-               return fileUploadHandler;
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkTextInterpreter.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DbkTextInterpreter.java
deleted file mode 100644 (file)
index eafddd9..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.argeo.docbook.ui;
-
-import static org.argeo.docbook.DbkUtils.isDbk;
-import static org.argeo.docbook.DbkType.para;
-import static org.argeo.docbook.DbkType.title;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.List;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.io.IOUtils;
-import org.argeo.cms.text.TextInterpreter;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrxType;
-
-/** Based on HTML with a few Wiki-like shortcuts. */
-public class DbkTextInterpreter implements TextInterpreter {
-
-       @Override
-       public void write(Item item, String content) {
-               try {
-                       if (item instanceof Node) {
-                               Node node = (Node) item;
-                               if (isDbk(node, para) || isDbk(node, title)) {
-                                       String raw = convertToStorage(node, content);
-                                       validateBeforeStoring(raw);
-                                       Node jcrText;
-                                       if (!node.hasNode(Jcr.JCR_XMLTEXT))
-                                               jcrText = node.addNode(Jcr.JCR_XMLTEXT, JcrxType.JCRX_XMLTEXT);
-                                       else
-                                               jcrText = node.getNode(Jcr.JCR_XMLTEXT);
-                                       jcrText.setProperty(Jcr.JCR_XMLCHARACTERS, raw);
-                               } else {
-                                       throw new IllegalArgumentException("Don't know how to interpret " + node);
-                               }
-                       } else {// property
-                               Property property = (Property) item;
-                               property.setValue(content);
-                       }
-                       // item.getSession().save();
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot set content on " + item, e);
-               }
-       }
-
-       @Override
-       public String read(Item item) {
-               try {
-                       String raw = raw(item);
-                       return convertFromStorage(item, raw);
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot get " + item + " for edit", e);
-               }
-       }
-
-       @Override
-       public String raw(Item item) {
-               try {
-                       item.getSession().refresh(true);
-                       if (item instanceof Node) {
-                               Node node = (Node) item;
-                               if (isDbk(node, para) || isDbk(node, title)) {
-                                       Node jcrText = node.getNode(Jcr.JCR_XMLTEXT);
-                                       String txt = jcrText.getProperty(Jcr.JCR_XMLCHARACTERS).getString();
-                                       // TODO make it more robust
-                                       // txt = txt.replace("\n", "").replace("\t", "");
-                                       txt = txt.replace("\t", "  ");
-                                       return txt;
-                               } else {
-                                       throw new IllegalArgumentException("Don't know how to interpret " + node);
-                               }
-                       } else {// property
-                               Property property = (Property) item;
-                               return property.getString();
-                       }
-               } catch (RepositoryException e) {
-                       throw new JcrException("Cannot get " + item + " content", e);
-               }
-       }
-
-       final static int BR_LENGTH = "<br/>".length();
-
-       public String readSimpleHtml(Item item) {
-               String raw = raw(item);
-               // FIXME the saved data should be corrected instead.
-               if (raw.indexOf('&') >= 0) {
-                       raw = raw.replace("&", "&amp;");
-               }
-               if (raw.indexOf('<') >= 0) {
-                       raw = raw.replace("<", "&lt;");
-               }
-               if (raw.indexOf('>') >= 0) {
-                       raw = raw.replace(">", "&gt;");
-               }
-               if (raw.indexOf('\"') >= 0) {
-                       raw = raw.replace("\"", "&quot;");
-               }
-               if (raw.indexOf('\'') >= 0) {
-                       raw = raw.replace("\'", "&apos;");
-               }
-//             raw = "<span style='text-align:justify'>" + raw + "</span>";
-               if (raw.length() == 0)
-                       return raw;
-               try (StringReader reader = new StringReader(raw)) {
-                       List<String> lines = IOUtils.readLines(reader);
-                       if (lines.size() == 1)
-                               return lines.get(0);
-                       StringBuilder sb = new StringBuilder(raw.length() + lines.size() * BR_LENGTH);
-                       for (int i = 0; i < lines.size(); i++) {
-                               if (i != 0)
-                                       sb.append("<br/>");
-                               sb.append(lines.get(i));
-                       }
-                       return sb.toString();
-               } catch (IOException e) {
-                       throw new RuntimeException(e);
-               }
-//             String[] lines = raw.split("[\r\n]+");
-//             if (lines.length == 1)
-//                     return lines[0];
-//             StringBuilder sb = new StringBuilder(raw.length() + lines.length * BR_LENGTH);
-//             for (int i = 0; i < lines.length; i++) {
-//                     if (i != 0)
-//                             sb.append("<br/>");
-//                     sb.append(lines[i]);
-//             }
-//             return sb.toString();
-       }
-
-       // EXTENSIBILITY
-       /**
-        * To be overridden, in order to make sure that only valid strings are being
-        * stored.
-        */
-       protected void validateBeforeStoring(String raw) {
-       }
-
-       /** To be overridden, in order to support additional formatting. */
-       protected String convertToStorage(Item item, String content) throws RepositoryException {
-               return content;
-
-       }
-
-       /** To be overridden, in order to support additional formatting. */
-       protected String convertFromStorage(Item item, String content) throws RepositoryException {
-               return content;
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocBookSectionTitle.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocBookSectionTitle.java
deleted file mode 100644 (file)
index 61a9164..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.argeo.docbook.ui;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.text.TextSection;
-import org.argeo.cms.ui.viewers.EditablePart;
-import org.argeo.cms.ui.viewers.NodePart;
-import org.argeo.cms.ui.widgets.EditableText;
-import org.eclipse.swt.widgets.Composite;
-
-/** The title of a section, based on an XML text node. */
-public class DocBookSectionTitle extends EditableText implements EditablePart, NodePart {
-       private static final long serialVersionUID = -1787983154946583171L;
-
-       private final TextSection section;
-
-       public DocBookSectionTitle(Composite parent, int swtStyle, Node titleNode) throws RepositoryException {
-               super(parent, swtStyle, titleNode);
-               section = (TextSection) TextSection.findSection(this);
-       }
-
-//     @Override
-       public TextSection getSection() {
-               return section;
-       }
-
-       @Override
-       public Node getItem() throws RepositoryException {
-               return getNode();
-       }
-
-//     @Override
-//     public String getPartId() {
-//             return getNodeId();
-//     }
-
-//     @Override
-//     protected void setControlLayoutData(Control control) {
-//             super.setControlLayoutData(control);
-//             control.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, true, false));
-//     }
-//
-//     @Override
-//     protected void setContainerLayoutData(Composite composite) {
-//             super.setContainerLayoutData(composite);
-//             composite.setLayoutData(new GridData(SWT.LEAD, SWT.BOTTOM, true, false));
-//     }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocumentPage.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocumentPage.java
deleted file mode 100644 (file)
index 8ba6085..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.argeo.docbook.ui;
-
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-
-import org.argeo.cms.text.TextEditorHeader;
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsLink;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.JcrVersionCmsEditable;
-import org.argeo.cms.ui.widgets.ScrolledPage;
-import org.argeo.docbook.DbkType;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Display the text of the context, and provide an editor if the user can edit.
- */
-public class DocumentPage implements CmsUiProvider {
-       public final static String WWW = "www";
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-
-               ScrolledPage page = new ScrolledPage(parent, SWT.NONE);
-               page.setLayout(CmsUiUtils.noSpaceGridLayout());
-               GridData textGd = CmsUiUtils.fillAll();
-               page.setLayoutData(textGd);
-
-               if (context.isNodeType(DbkType.article.get())) {
-                       CmsEditable cmsEditable = new JcrVersionCmsEditable(context);
-                       if (cmsEditable.canEdit())
-                               new TextEditorHeader(cmsEditable, parent, SWT.NONE).setLayoutData(CmsUiUtils.fillWidth());
-                       if (!cmsEditable.isEditing())
-                               cmsEditable.startEditing();
-                       new DocumentTextEditor(page, SWT.FLAT, context, cmsEditable);
-               } else {
-                       parent.setBackgroundMode(SWT.INHERIT_NONE);
-                       if (context.getSession().hasPermission(context.getPath(), Session.ACTION_ADD_NODE)) {
-//                             new DocumentTextEditor(page, SWT.FLAT, indexNode, cmsEditable);
-//                             textGd.heightHint = 400;
-
-                               for (NodeIterator ni = context.getNodes(); ni.hasNext();) {
-                                       Node textNode = ni.nextNode();
-                                       if (textNode.isNodeType(NodeType.NT_FOLDER))
-                                               new CmsLink(textNode.getName() + "/", textNode.getPath()).createUi(parent, textNode);
-                               }
-                               for (NodeIterator ni = context.getNodes(); ni.hasNext();) {
-                                       Node textNode = ni.nextNode();
-                                       if (textNode.isNodeType(DbkType.article.get()) && !textNode.getName().equals(WWW))
-                                               new CmsLink(textNode.getName(), textNode.getPath()).createUi(parent, textNode);
-                               }
-                       }
-               }
-               return page;
-       }
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocumentTextEditor.java b/publishing/org.argeo.publishing.ui/src/org/argeo/docbook/ui/DocumentTextEditor.java
deleted file mode 100644 (file)
index bac3fc3..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.argeo.docbook.ui;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.text.TextSection;
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.docbook.DbkUtils;
-import org.argeo.docbook.DbkType;
-import org.eclipse.swt.widgets.Composite;
-
-/** Text editor where sections and subsections can be managed by the user. */
-public class DocumentTextEditor extends AbstractDbkViewer {
-       private static final long serialVersionUID = 6049661610883342325L;
-
-       public DocumentTextEditor(Composite parent, int style, Node textNode, CmsEditable cmsEditable) {
-               super(new TextSection(parent, style, textNode), style, cmsEditable);
-               refresh();
-               getMainSection().setLayoutData(CmsUiUtils.fillWidth());
-       }
-
-       @Override
-       protected void initModel(Node textNode) throws RepositoryException {
-               if (isFlat()) {
-                       DbkUtils.addParagraph(textNode, "");
-               }
-//             else
-//                     textNode.setProperty(DocBookNames.DBK_TITLE, textNode.getName());
-       }
-
-       @Override
-       protected Boolean isModelInitialized(Node textNode) throws RepositoryException {
-               return textNode.hasNode(DbkType.title.get()) || textNode.hasNode(DbkType.para.get())
-                               || (!isFlat() && textNode.hasNode(DbkType.section.get()));
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/DbkServlet.java
deleted file mode 100644 (file)
index a05bb47..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-package org.argeo.publishing.servlet;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URLDecoder;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.xalan.processor.TransformerFactoryImpl;
-import org.argeo.cms.servlet.ServletAuthUtils;
-import org.argeo.cms.ui.CmsTheme;
-import org.argeo.docbook.DbkUtils;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrException;
-import org.argeo.jcr.JcrUtils;
-import org.w3c.dom.Document;
-
-/**
- * A servlet transforming a dbk:* JCR node into HTML, using the DocBook XSL.
- */
-public class DbkServlet extends HttpServlet {
-       private static final long serialVersionUID = 6906020513498289335L;
-
-       private Repository repository;
-
-       private DocumentBuilderFactory documentBuilderFactory;
-       private TransformerFactory transformerFactory;
-       private Templates docBoookTemplates;
-
-       private Map<String, CmsTheme> themes = Collections.synchronizedMap(new HashMap<>());
-
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-
-               String pathInfo = req.getPathInfo();
-               if (pathInfo.startsWith("//"))
-                       pathInfo = pathInfo.substring(1);
-               String path = URLDecoder.decode(pathInfo, StandardCharsets.UTF_8);
-
-               if (path.toLowerCase().endsWith(".css")) {
-                       path = path.substring(1);
-                       int firstSlash = path.indexOf('/');
-                       String themeId = path.substring(0, firstSlash);
-                       String cssPath = path.substring(firstSlash);
-                       CmsTheme cmsTheme = themes.get(themeId);
-                       if (cmsTheme == null)
-                               throw new IllegalArgumentException("Theme " + themeId + " not found.");
-                       resp.setContentType("text/css");
-                       IOUtils.copy(cmsTheme.getResourceAsStream(cssPath), resp.getOutputStream());
-                       return;
-               }
-
-               Session session = null;
-               try {
-                       session = ServletAuthUtils.doAs(() -> Jcr.login(repository, null), req);
-                       Node node = session.getNode(path);
-                       if (DbkUtils.isDbk(node)) {
-                               CmsTheme cmsTheme = null;
-                               String themeId = req.getParameter("themeId");
-                               if (themeId != null) {
-                                       cmsTheme = themes.get(themeId);
-                                       if (cmsTheme == null)
-                                               throw new IllegalArgumentException("Theme " + themeId + " not found.");
-                               }
-
-                               // TODO customise DocBook so that it outputs UTF-8
-                               // see http://www.sagehill.net/docbookxsl/OutputEncoding.html
-                               resp.setContentType("text/html; charset=ISO-8859-1");
-
-                               // TODO optimise with pipes, SAX, etc. ?
-                               byte[] arr;
-                               try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
-                                       session.exportDocumentView(path, out, true, false);
-                                       arr = out.toByteArray();
-//                             System.out.println(new String(arr, StandardCharsets.UTF_8));
-                               } catch (RepositoryException e) {
-                                       throw new JcrException(e);
-                               }
-
-                               try (InputStream in = new ByteArrayInputStream(arr);
-//                                     ByteArrayOutputStream out = new ByteArrayOutputStream();
-                               ) {
-
-                                       Result xmlOutput = new StreamResult(resp.getOutputStream());
-
-                                       DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
-//                             Document doc = docBuilder.parse(new File(
-//                                             System.getProperty("user.home") + "/dev/git/gpl/argeo-qa/doc/platform/argeo-platform.dbk.xml"));
-                                       Document doc = docBuilder.parse(in);
-                                       Source xmlInput = new DOMSource(doc);
-
-                                       Transformer transformer = docBoookTemplates.newTransformer();
-
-                                       // gather CSS
-                                       if (cmsTheme != null) {
-                                               StringBuilder sb = new StringBuilder();
-                                               for (String cssPath : cmsTheme.getWebCssPaths()) {
-                                                       sb.append(req.getContextPath()).append(req.getServletPath()).append('/');
-                                                       sb.append(themeId).append('/').append(cssPath).append(' ');
-                                               }
-                                               sb.append("https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap").append(' ');
-                                               sb.append("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,300;0,400;0,600;1,400&display=swap").append(' ');
-                                               if (sb.length() > 0)
-                                                       transformer.setParameter("html.stylesheet", sb.toString());
-                                       }
-                                       transformer.transform(xmlInput, xmlOutput);
-//                             resp.getOutputStream().write(out.toByteArray());
-                               } catch (Exception e) {
-                                       throw new ServletException("Cannot transform " + path, e);
-                               }
-                       } else if (node.isNodeType(NodeType.NT_FILE)) {// media download etc.
-                               String fileNameLowerCase = node.getName().toLowerCase();
-                               if (fileNameLowerCase.endsWith(".jpg") || fileNameLowerCase.endsWith(".jpeg")) {
-                                       resp.setContentType("image/jpeg");
-                               } else if (fileNameLowerCase.endsWith(".png")) {
-                                       resp.setContentType("image/png");
-                               } else if (fileNameLowerCase.endsWith(".gif")) {
-                                       resp.setContentType("image/gif");
-                               } else if (fileNameLowerCase.endsWith(".svg")) {
-                                       resp.setContentType("image/svg+xml");
-                               } else {
-                                       // TODO know more content types...
-                                       resp.setHeader("Content-Disposition", "attachment; filename=\"" + node.getName() + "\"");
-                               }
-                               IOUtils.copy(JcrUtils.getFileAsStream(node), resp.getOutputStream());
-                       } else {
-                               throw new IllegalArgumentException("Unsupported node " + node);
-                       }
-               } catch (RepositoryException e1) {
-                       throw new JcrException(e1);
-               } finally {
-                       Jcr.logout(session);
-               }
-       }
-
-       @Override
-       public void init() throws ServletException {
-
-               // TODO improve configuration and provisioning of DocBook XSL
-               String xslBase = System.getProperty("argeo.docbook.xsl");
-               if (xslBase == null) {
-                       String defaultXslBase = "/opt/docbook-xsl";
-                       if (!Files.exists(Paths.get(defaultXslBase))) {
-                               throw new ServletException("System property argeo.docbook.xsl is not set and default location "
-                                               + defaultXslBase + " does not exist.");
-                       } else {
-                               xslBase = defaultXslBase;
-                       }
-               }
-               String xsl = xslBase + "/html/docbook.xsl";
-
-               documentBuilderFactory = DocumentBuilderFactory.newInstance();
-               documentBuilderFactory.setXIncludeAware(true);
-               documentBuilderFactory.setNamespaceAware(true);
-
-               // We must explicitly use the non-XSLTC transformer, as XSLTC is not working
-               // with DocBook stylesheets
-               transformerFactory = new TransformerFactoryImpl();
-
-               Source xslSource = new StreamSource(xsl);
-               try {
-                       docBoookTemplates = transformerFactory.newTemplates(xslSource);
-                       if (docBoookTemplates == null)
-                               throw new ServletException("Could not instantiate XSL " + xsl);
-               } catch (TransformerConfigurationException e) {
-                       throw new ServletException("Cannot instantiate XSL " + xsl, e);
-               }
-       }
-
-       public void setRepository(Repository repository) {
-               this.repository = repository;
-       }
-
-       public void addTheme(CmsTheme theme, Map<String, String> properties) {
-               themes.put(theme.getThemeId(), theme);
-       }
-
-       public void removeTheme(CmsTheme theme, Map<String, String> properties) {
-               themes.remove(theme.getThemeId());
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/FontsServlet.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/servlet/FontsServlet.java
deleted file mode 100644 (file)
index 5bc6d0c..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.argeo.publishing.servlet;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.argeo.cms.ui.CmsTheme;
-
-/** Serves fonts locally. */
-public class FontsServlet extends HttpServlet {
-       private static final long serialVersionUID = 6009572962850708537L;
-       private Map<String, CmsTheme> themes = Collections.synchronizedMap(new HashMap<>());
-
-       @Override
-       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-               String font = req.getPathInfo();
-               font = font.substring(1, font.length());
-               for (CmsTheme theme : themes.values()) {
-                       for (String fontPath : theme.getFontsPaths()) {
-                               if (fontPath.endsWith(font)) {
-                                       if (font.endsWith(".woff"))
-                                               resp.setContentType("font/woff");
-                                       else if (font.endsWith(".woff2"))
-                                               resp.setContentType("font/woff2");
-                                       try (InputStream in = theme.loadPath(fontPath)) {
-                                               IOUtils.copy(in, resp.getOutputStream());
-                                               return;
-                                       }
-                               }
-                       }
-               }
-               resp.setStatus(404);
-       }
-
-       public void addTheme(CmsTheme theme, Map<String, String> properties) {
-               themes.put(theme.getThemeId(), theme);
-       }
-
-       public void removeTheme(CmsTheme theme, Map<String, String> properties) {
-               themes.remove(theme.getThemeId());
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/DocumentUiProvider.java
deleted file mode 100644 (file)
index 1170765..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.argeo.publishing.ui;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.NodeType;
-
-import org.argeo.cms.ui.CmsEditable;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.cms.ui.util.CmsLink;
-import org.argeo.cms.ui.util.CmsUiUtils;
-import org.argeo.cms.ui.viewers.JcrVersionCmsEditable;
-import org.argeo.cms.ui.widgets.ScrolledPage;
-import org.argeo.docbook.DbkType;
-import org.argeo.docbook.ui.AbstractDbkViewer;
-import org.argeo.docbook.ui.DocumentTextEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-public class DocumentUiProvider implements CmsUiProvider {
-
-       @Override
-       public Control createUi(Composite parent, Node context) throws RepositoryException {
-               CmsEditable cmsEditable = new JcrVersionCmsEditable(context);
-               if (context.hasNode(DbkType.article.get())) {
-                       Node textNode = context.getNode(DbkType.article.get());
-                       // Title
-                       parent.setLayout(CmsUiUtils.noSpaceGridLayout());
-
-                       CmsLink toHtml = new CmsLink("To HTML", "/html/dbk" + textNode.getPath());
-                       toHtml.createUiPart(parent, context);
-
-                       ScrolledPage page = new ScrolledPage(parent, SWT.NONE);
-                       page.setLayoutData(CmsUiUtils.fillAll());
-                       page.setLayout(CmsUiUtils.noSpaceGridLayout());
-
-                       AbstractDbkViewer dbkEditor = new DocumentTextEditor(page, SWT.NONE, textNode, cmsEditable);
-                       return page;
-
-               } else if (context.isNodeType(NodeType.NT_FILE)) {
-                       String fileName = context.getName();
-                       if (fileName.endsWith(".pdf")) {
-                               Browser browser = new Browser(parent, SWT.NONE);
-                               String dataPath = CmsUiUtils.getDataPath(context);
-                               browser.setUrl(dataPath);
-                               browser.setLayoutData(CmsUiUtils.fillAll());
-                               return browser;
-                       }
-               }
-               return null;
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/PublishingApp.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/PublishingApp.java
deleted file mode 100644 (file)
index f527d5b..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.argeo.publishing.ui;
-
-import static org.argeo.suite.ui.SuiteApp.DEFAULT_THEME_ID_PROPERTY;
-import static org.argeo.suite.ui.SuiteApp.DEFAULT_UI_NAME_PROPERTY;
-
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.api.NodeUtils;
-import org.argeo.cms.ui.AbstractCmsApp;
-import org.argeo.cms.ui.CmsApp;
-import org.argeo.cms.ui.CmsUiProvider;
-import org.argeo.docbook.DbkType;
-import org.argeo.docbook.ui.DocumentPage;
-import org.argeo.jcr.Jcr;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.util.LangUtils;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.osgi.framework.Constants;
-
-/**
- * A {@link CmsApp} dedicated to publishing, typically a public or internal web
- * site.
- */
-public class PublishingApp extends AbstractCmsApp {
-       private final static Log log = LogFactory.getLog(PublishingApp.class);
-
-       private String pid;
-       private String defaultThemeId;
-       private String defaultUiName = "";
-
-       private CmsUiProvider landingPage;
-
-       public void init(Map<String, String> properties) {
-               if (properties.containsKey(DEFAULT_UI_NAME_PROPERTY))
-                       defaultUiName = LangUtils.get(properties, DEFAULT_UI_NAME_PROPERTY);
-               if (properties.containsKey(DEFAULT_THEME_ID_PROPERTY))
-                       defaultThemeId = LangUtils.get(properties, DEFAULT_THEME_ID_PROPERTY);
-               pid = properties.get(Constants.SERVICE_PID);
-
-               if (log.isDebugEnabled())
-                       log.info("Publishing App " + pid + " started");
-       }
-
-       public void destroy(Map<String, String> properties) {
-               if (log.isDebugEnabled())
-                       log.info("Publishing App " + pid + " stopped");
-
-       }
-
-       @Override
-       public Set<String> getUiNames() {
-               Set<String> uiNames = new HashSet<>();
-               uiNames.add(defaultUiName);
-               return uiNames;
-       }
-
-       @Override
-       public Composite initUi(Composite parent) {
-               Session adminSession = NodeUtils.openDataAdminSession(getRepository(), null);
-               parent.setLayout(new GridLayout());
-               Node indexNode;
-               try {
-                       indexNode = JcrUtils.getOrAdd(Jcr.getRootNode(adminSession), DocumentPage.WWW, DbkType.article.get());
-                       adminSession.save();
-               } catch (RepositoryException e) {
-                       throw new IllegalStateException(e);
-               }
-
-               Control page;
-               if (landingPage != null) {
-                       page = landingPage.createUiPart(parent, indexNode);
-               } else {
-                       page = new DocumentPage().createUiPart(parent, indexNode);
-               }
-               return (Composite) page;
-       }
-
-       @Override
-       public void refreshUi(Composite parent, String state) {
-               parent.setLayout(new GridLayout());
-               new DocumentPage().createUiPart(parent, null);
-       }
-
-       @Override
-       public void setState(Composite parent, String state) {
-
-       }
-
-       @Override
-       protected String getThemeId(String uiName) {
-               return defaultThemeId;
-       }
-
-       public void setLandingPage(CmsUiProvider landingPage) {
-               this.landingPage = landingPage;
-       }
-
-}
diff --git a/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/PublishingStyle.java b/publishing/org.argeo.publishing.ui/src/org/argeo/publishing/ui/PublishingStyle.java
deleted file mode 100644 (file)
index f6381dd..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.argeo.publishing.ui;
-
-import org.argeo.cms.ui.util.CmsStyle;
-
-/** Publishing styles. */
-public enum PublishingStyle implements CmsStyle {
-       // general
-       page, coverTitle, coverSubTitle, coverTagline, bannerLine1, bannerLine2,
-       // meta data
-       tag, menu,
-       // text style
-       title, subTitle, chapo, para, sectionTitle, subSectionTitle,
-       // composite style
-       framed, line;
-
-       @Override
-       public String getClassPrefix() {
-               return "argeo-publishing";
-       }
-
-}
diff --git a/publishing/pom.xml b/publishing/pom.xml
deleted file mode 100644 (file)
index 5dfdd44..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-       <modelVersion>4.0.0</modelVersion>
-       <parent>
-               <groupId>org.argeo.suite</groupId>
-               <artifactId>argeo-suite</artifactId>
-               <version>2.3.1-SNAPSHOT</version>
-               <relativePath>..</relativePath>
-       </parent>
-       <artifactId>publishing</artifactId>
-       <name>Argeo Publishing Components</name>
-       <packaging>pom</packaging>
-       <modules>
-               <module>org.argeo.publishing.ui</module>
-       </modules>
-</project>
diff --git a/sdk/argeo-build b/sdk/argeo-build
new file mode 160000 (submodule)
index 0000000..979b11e
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 979b11e352bda7d783c921a62e8cb5ed950a7564
diff --git a/sdk/argeo-office-e4-rap.properties b/sdk/argeo-office-e4-rap.properties
deleted file mode 100644 (file)
index 0002618..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-argeo.osgi.start.2.node=\
-org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.metatype,\
-org.eclipse.equinox.cm,\
-org.eclipse.rap.rwt.osgi
-
-argeo.osgi.start.2.suite=\
-org.apache.tika.parsers
-
-argeo.osgi.start.3.node=\
-org.argeo.cms
-
-argeo.osgi.start.5.suite=\
-org.argeo.suite.cms,\
-org.argeo.suite.e4.rap,\
-org.argeo.suite.standard,\
-org.argeo.suite.tracker
-
-# Local
-argeo.node.repo.type=h2
-org.osgi.service.http.port=7070
-#org.osgi.service.http.port.secure=7073
-
-#argeo.node.useradmin.uris=ldap://cn=Directory%20Manager:argeoargeo@localhost:10389/dc=example,dc=com
-
-argeo.node.init=../../init
-
-argeo.i18n.locales=en,fr,de,ar
-argeo.i18n.defaultLocale=en
-
-#tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml
-
-# Logging
-log4j.configuration=file:../../log4j.properties
-
-# DON'T CHANGE BELOW
-org.eclipse.equinox.http.jetty.autostart=false
-org.osgi.framework.bootdelegation=com.sun.jndi.ldap,\
-com.sun.jndi.ldap.sasl,\
-com.sun.security.jgss,\
-com.sun.jndi.dns,\
-com.sun.nio.file,\
-com.sun.nio.sctp
index 80d51c55e0b8c6dde0c5d02558fb450367625f60..7c5228844b364ecc55dfcd81720e93a41cae90b8 100644 (file)
@@ -1,23 +1,48 @@
-argeo.osgi.start.2.node=\
-org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.http.jetty,\
-org.eclipse.equinox.metatype,\
-org.eclipse.equinox.cm,\
+argeo.osgi.start.2=\
+org.apache.felix.scr,\
+org.argeo.init
 
-argeo.osgi.start.3.node=\
-org.argeo.cms
+argeo.osgi.start.3=\
+org.argeo.cms,\
+org.argeo.cms.swt.rcp,\
+org.argeo.cms.ee,\
+org.argeo.cms.lib.dbus,\
+org.argeo.cms.lib.equinox,\
+org.argeo.cms.lib.jetty,\
 
-applicationXMI=org.argeo.suite.e4/e4xmi/argeo-office.e4xmi
-#applicationXMI=org.argeo.cms.e4.rcp/argeo-companion.e4xmi
+argeo.osgi.start.4=\
+org.argeo.cms.jcr
 
-lifeCycleURI=bundleclass://org.argeo.cms.e4.rcp/org.argeo.cms.e4.rcp.CmsRcpLifeCycle
-clearPersistedState=true
-#argeo.cms.desktop.inTray=true
+argeo.osgi.start.5=\
+org.argeo.app.profile.acr.fs,\
+org.argeo.app.core,\
+org.argeo.app.geo,\
+org.argeo.app.jcr,\
+org.argeo.app.ui,\
+org.argeo.app.theme.default,\
+org.argeo.app.servlet.publish,\
+org.argeo.app.servlet.odk
 
-org.osgi.service.http.port=7070
 
-log4j.configuration=file:../../log4j.properties
-argeo.node.useradmin.uris=os:///
-eclipse.application=org.argeo.cms.e4.rcp.CmsE4Application
-#eclipse.application=org.eclipse.e4.ui.workbench.swt.E4Application
+# Local
+argeo.node.repo.type=h2
+argeo.http.port=7070
+
+#argeo.directory=os:///
+argeo.directory=ipa:///
+
+# Logging
+log.org.argeo=DEBUG
+
+# DON'T CHANGE BELOW
 org.eclipse.equinox.http.jetty.autostart=false
+org.osgi.framework.system.packages.extra=\
+sun.security.internal.spec,\
+sun.security.provider,\
+com.sun.net.httpserver,\
+com.sun.jndi.ldap,\
+com.sun.jndi.ldap.sasl,\
+com.sun.jndi.dns,\
+com.sun.security.jgss,\
+com.sun.nio.file,\
+com.sun.nio.sctp
\ No newline at end of file
diff --git a/sdk/argeo-suite-rap.properties b/sdk/argeo-suite-rap.properties
deleted file mode 100644 (file)
index 60f0b9b..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-argeo.osgi.start.2.node=\
-org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.metatype,\
-org.eclipse.equinox.cm,\
-org.eclipse.rap.rwt.osgi
-
-argeo.osgi.start.2.suite=\
-org.apache.tika.parsers
-
-argeo.osgi.start.3.node=\
-org.argeo.cms
-
-argeo.osgi.start.5.suite=\
-org.argeo.suite.core,\
-org.argeo.suite.ui,\
-org.argeo.suite.theme.default,\
-org.argeo.suite.ui.rap
-
-argeo.osgi.start.6.suite=\
-org.argeo.documents.ui,\
-org.argeo.people.ui,\
-org.argeo.geo.ui
-
-
-# Local
-argeo.node.repo.type=h2
-org.osgi.service.http.port=7070
-#org.osgi.service.http.port.secure=7073
-
-#argeo.node.useradmin.uris=ldap://cn=Directory%20Manager:argeoargeo@localhost:10389/dc=example,dc=com
-
-argeo.node.init=../../init
-
-argeo.i18n.locales=en,fr
-argeo.i18n.defaultLocale=en
-
-#tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml
-
-# Logging
-log4j.configuration=file:../../log4j.properties
-
-# DON'T CHANGE BELOW
-org.eclipse.equinox.http.jetty.autostart=false
-org.osgi.framework.bootdelegation=com.sun.jndi.ldap,\
-com.sun.jndi.ldap.sasl,\
-com.sun.security.jgss,\
-com.sun.jndi.dns,\
-com.sun.nio.file,\
-com.sun.nio.sctp
diff --git a/sdk/argeo-suite-rcp.properties b/sdk/argeo-suite-rcp.properties
deleted file mode 100644 (file)
index 4cc7c87..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-argeo.osgi.start.2.node=\
-org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.metatype,\
-org.eclipse.equinox.cm,\
-org.eclipse.rap.rwt.osgi
-
-argeo.osgi.start.2.suite=\
-org.apache.tika.parsers
-
-argeo.osgi.start.3.node=\
-org.argeo.cms
-
-argeo.osgi.start.5.suite=\
-org.argeo.suite.ui,\
-org.argeo.suite.theme.default,\
-org.argeo.cms.ui.rcp
-
-# Local
-argeo.node.repo.type=h2
-org.osgi.service.http.port=7070
-#org.osgi.service.http.port.secure=7073
-
-#argeo.node.useradmin.uris=ldap://cn=Directory%20Manager:argeoargeo@localhost:10389/dc=example,dc=com
-
-argeo.node.init=../../init
-
-argeo.i18n.locales=en,fr
-argeo.i18n.defaultLocale=en
-
-#tika.config=/home/mbaudier/dev/git/gpl/argeo-suite/sdk/exec/argeo-office-e4-rap/data/indexes/node/tika-config.xml
-
-# Logging
-log4j.configuration=file:../../log4j.properties
-
-# DON'T CHANGE BELOW
-org.eclipse.equinox.http.jetty.autostart=false
-org.osgi.framework.bootdelegation=com.sun.jndi.ldap,\
-com.sun.jndi.ldap.sasl,\
-com.sun.security.jgss,\
-com.sun.jndi.dns,\
-com.sun.nio.file,\
-com.sun.nio.sctp
diff --git a/sdk/argeo-suite-server.properties b/sdk/argeo-suite-server.properties
new file mode 100644 (file)
index 0000000..a9b3271
--- /dev/null
@@ -0,0 +1,50 @@
+argeo.osgi.start.2=\
+org.eclipse.equinox.http.servlet,\
+org.apache.felix.scr,\
+org.eclipse.rap.rwt.osgi,\
+org.argeo.init
+
+argeo.osgi.start.3=\
+org.argeo.cms,\
+org.argeo.cms.swt.rap,\
+org.argeo.cms.swt.rcp,\
+org.argeo.cms.ee,\
+org.argeo.cms.lib.sshd,\
+org.argeo.cms.lib.equinox,\
+org.argeo.cms.lib.jetty,\
+
+argeo.osgi.start.4=\
+org.argeo.cms.jcr
+
+argeo.osgi.start.5=\
+org.argeo.app.profile.acr.fs,\
+org.argeo.app.core,\
+org.argeo.app.jcr,\
+org.argeo.app.ui,\
+org.argeo.app.theme.default,\
+org.argeo.app.servlet.publish,\
+org.argeo.app.servlet.odk,\
+org.argeo.suite.knowledge,\
+
+
+# Local
+argeo.node.repo.type=h2
+argeo.http.port=7070
+
+argeo.directory=dc=example,dc=com
+
+# Logging
+log.org.argeo=DEBUG
+
+# DON'T CHANGE BELOW
+org.eclipse.equinox.http.jetty.autostart=false
+org.osgi.framework.system.packages.extra=\
+sun.security.internal.spec,\
+sun.security.provider,\
+com.sun.net.httpserver,\
+com.sun.jndi.ldap,\
+com.sun.jndi.ldap.sasl,\
+com.sun.jndi.dns,\
+com.sun.security.jgss,\
+com.sun.nio.file,\
+com.sun.nio.sctp
\ No newline at end of file
diff --git a/sdk/argeo-wm.properties b/sdk/argeo-wm.properties
deleted file mode 100644 (file)
index ed4fc57..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-argeo.osgi.start.2.node=\
-org.eclipse.equinox.http.servlet,\
-org.eclipse.equinox.http.jetty,\
-org.eclipse.equinox.metatype,\
-org.eclipse.equinox.cm,\
-
-argeo.osgi.start.3.node=\
-org.argeo.cms
-
-applicationXMI=org.argeo.suite.e4/e4xmi/argeo-wm.e4xmi
-lifeCycleURI=bundleclass://org.argeo.cms.e4.rcp/org.argeo.cms.e4.rcp.CmsRcpLifeCycle
-clearPersistedState=true
-#argeo.cms.desktop.inTray=true
-
-org.osgi.service.http.port=7070
-
-log4j.configuration=file:../../log4j.properties
-argeo.node.useradmin.uris=os:///
-eclipse.application=org.argeo.cms.e4.rcp.CmsE4Application
-org.eclipse.equinox.http.jetty.autostart=false
diff --git a/sdk/branches/testing.bnd b/sdk/branches/testing.bnd
new file mode 100644 (file)
index 0000000..8d587b1
--- /dev/null
@@ -0,0 +1,12 @@
+major=2
+minor=1
+micro=32
+qualifier=.next
+
+Bundle-Copyright= \
+Copyright 2014-2023 Argeo GmbH, \
+Copyright 2017-2023 Mathieu Baudier
+
+SPDX-License-Identifier= \
+GPL-2.0-or-later \
+OR LicenseRef-argeo2-GPL-2.0-or-later-with-EPL-and-Apache-and-JCR-permissions
diff --git a/sdk/branches/unstable.bnd b/sdk/branches/unstable.bnd
new file mode 100644 (file)
index 0000000..060ef94
--- /dev/null
@@ -0,0 +1,12 @@
+major=2
+minor=3
+micro=24
+qualifier=
+
+Bundle-Copyright= \
+Copyright 2014-2023 Argeo GmbH, \
+Copyright 2017-2023 Mathieu Baudier
+
+SPDX-License-Identifier= \
+GPL-2.0-or-later \
+OR LicenseRef-argeo2-GPL-2.0-or-later-with-EPL-and-Apache-and-JCR-permissions
diff --git a/sdk/deploy/.gitignore b/sdk/deploy/.gitignore
new file mode 100644 (file)
index 0000000..f5135fa
--- /dev/null
@@ -0,0 +1 @@
+!bin
\ No newline at end of file
diff --git a/sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/config.ini b/sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/config.ini
new file mode 100644 (file)
index 0000000..b8dab60
--- /dev/null
@@ -0,0 +1,36 @@
+osgi.clean=true
+
+argeo.osgi.start.2=\
+org.eclipse.equinox.http.servlet,\
+org.eclipse.equinox.console,\
+org.apache.felix.scr,\
+org.eclipse.core.runtime,\
+org.eclipse.e4.ui.css.swt,\
+
+argeo.osgi.start.3=\
+org.argeo.cms,\
+org.argeo.cms.swt.rcp,\
+org.argeo.cms.ee,\
+org.argeo.cms.lib.sshd,\
+org.argeo.cms.lib.equinox,\
+org.argeo.cms.lib.jetty,\
+
+argeo.osgi.start.4=\
+org.argeo.cms.jcr
+
+argeo.osgi.start.5=\
+org.argeo.app.profile.acr.fs,\
+org.argeo.app.core,\
+org.argeo.app.ui,\
+org.argeo.app.theme.default,\
+org.argeo.app.servlet.publish,\
+org.argeo.app.servlet.odk
+
+
+# Local
+argeo.node.repo.type=h2
+argeo.http.port=0
+
+argeo.osgi.sources=\
+a2+reference:///?swt=rcp,\
+a2+reference:///usr/lib/a2/?swt=rcp
diff --git a/sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/jvm.args b/sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/jvm.args
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/system.properties b/sdk/deploy/argeo-desktop/etc/argeo.user.d/desktop/system.properties
new file mode 100644 (file)
index 0000000..62fe6da
--- /dev/null
@@ -0,0 +1 @@
+log.org.argeo=INFO
\ No newline at end of file
diff --git a/sdk/deploy/argeo-desktop/usr/share/applications/argeo.desktop b/sdk/deploy/argeo-desktop/usr/share/applications/argeo.desktop
new file mode 100644 (file)
index 0000000..b0666ce
--- /dev/null
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Argeo
+Exec=/usr/bin/argeo-desktop-open argeo/app
+#Icon=
+Type=Application
diff --git a/sdk/deploy/argeo-server/etc/argeo.d/server/config.ini b/sdk/deploy/argeo-server/etc/argeo.d/server/config.ini
new file mode 100644 (file)
index 0000000..163a6d5
--- /dev/null
@@ -0,0 +1,46 @@
+osgi.clean=true
+
+argeo.osgi.start.2=\
+org.eclipse.equinox.http.servlet,\
+org.eclipse.equinox.console,\
+org.apache.felix.scr,\
+org.eclipse.rap.rwt.osgi,\
+
+argeo.osgi.start.3=\
+org.argeo.cms,\
+org.argeo.cms.swt.rap,\
+org.argeo.cms.ee,\
+org.argeo.cms.lib.sshd,\
+org.argeo.cms.lib.equinox,\
+org.argeo.cms.lib.jetty,\
+
+argeo.osgi.start.4=\
+org.argeo.cms.jcr
+
+argeo.osgi.start.5=\
+org.argeo.app.profile.acr.fs,\
+org.argeo.app.core,\
+org.argeo.app.geo,\
+org.argeo.app.jcr,\
+org.argeo.app.ui,\
+org.argeo.app.theme.default,\
+org.argeo.app.servlet.publish,\
+org.argeo.app.servlet.odk
+
+# Local
+argeo.http.port=8080
+#argeo.https.port=8443
+
+argeo.directory=dc=example,dc=com.ldif
+#argeo.directory=ldap://cn=Directory%20Manager:password@localhost/dc=example,dc=com
+#argeo.directory=ipa:///
+
+argeo.node.repo.type=h2
+
+#argeo.node.repo.type=postgresql_ds
+#argeo.node.repo.dburl=jdbc:postgresql://localhost/argeo
+#argeo.node.repo.dbuser=
+#argeo.node.repo.dbpassword=
+
+argeo.osgi.sources=\
+a2+reference:///?swt=rap
diff --git a/sdk/deploy/argeo-server/etc/argeo.d/server/jvm.args b/sdk/deploy/argeo-server/etc/argeo.d/server/jvm.args
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/sdk/deploy/argeo-server/etc/argeo.d/server/system.properties b/sdk/deploy/argeo-server/etc/argeo.d/server/system.properties
new file mode 100644 (file)
index 0000000..62fe6da
--- /dev/null
@@ -0,0 +1 @@
+log.org.argeo=INFO
\ No newline at end of file
diff --git a/sdk/init/node/dc=example,dc=com.ldif b/sdk/init/node/dc=example,dc=com.ldif
deleted file mode 100644 (file)
index 5371306..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-dn: uid=coworker,ou=People,dc=example,dc=com
-objectClass: inetOrgPerson
-objectClass: organizationalPerson
-objectClass: person
-objectClass: top
-givenName: John
-sn: Coworker
-userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
-mail: coworker@localhost
-uid: coworker
-cn: John Coworker
-description: A regular coworker
-
-dn: uid=manager,ou=People,dc=example,dc=com
-objectClass: inetOrgPerson
-objectClass: organizationalPerson
-objectClass: person
-objectClass: top
-givenName: Mary
-sn: Manager
-userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
-mail: manager@localhost
-uid: manager
-cn: Mary Manager
-description: A manager
-
-dn: uid=root,ou=People,dc=example,dc=com
-objectClass: inetOrgPerson
-objectClass: person
-objectClass: organizationalPerson
-objectClass: top
-givenName: Super
-sn: User
-userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
-mail: root@localhost
-uid: root
-cn: Super User
-description: Superuser
-
diff --git a/sdk/init/node/ou=roles,ou=node.ldif b/sdk/init/node/ou=roles,ou=node.ldif
deleted file mode 100644 (file)
index 3c70185..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-dn: cn=admin,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: admin
-member: uid=root,ou=People,dc=example,dc=com
-
-dn: cn=org.argeo.suite.coworker,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.suite.coworker
-member: cn=org.argeo.suite.manager,ou=roles,ou=node
-member: uid=coworker,ou=People,dc=example,dc=com
-
-dn: cn=org.argeo.suite.manager,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.suite.manager
-member: uid=manager,ou=People,dc=example,dc=com
-member: uid=root,ou=People,dc=example,dc=com
-
-dn: cn=userAdmin,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: userAdmin
-member: cn=admin,ou=roles,ou=node
-
diff --git a/sdk/init/private/dc=example,dc=com.ldif b/sdk/init/private/dc=example,dc=com.ldif
new file mode 100644 (file)
index 0000000..5371306
--- /dev/null
@@ -0,0 +1,39 @@
+dn: uid=coworker,ou=People,dc=example,dc=com
+objectClass: inetOrgPerson
+objectClass: organizationalPerson
+objectClass: person
+objectClass: top
+givenName: John
+sn: Coworker
+userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
+mail: coworker@localhost
+uid: coworker
+cn: John Coworker
+description: A regular coworker
+
+dn: uid=manager,ou=People,dc=example,dc=com
+objectClass: inetOrgPerson
+objectClass: organizationalPerson
+objectClass: person
+objectClass: top
+givenName: Mary
+sn: Manager
+userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
+mail: manager@localhost
+uid: manager
+cn: Mary Manager
+description: A manager
+
+dn: uid=root,ou=People,dc=example,dc=com
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: organizationalPerson
+objectClass: top
+givenName: Super
+sn: User
+userPassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
+mail: root@localhost
+uid: root
+cn: Super User
+description: Superuser
+
diff --git a/sdk/init/private/ou=roles,ou=node.ldif b/sdk/init/private/ou=roles,ou=node.ldif
new file mode 100644 (file)
index 0000000..3c70185
--- /dev/null
@@ -0,0 +1,26 @@
+dn: cn=admin,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: admin
+member: uid=root,ou=People,dc=example,dc=com
+
+dn: cn=org.argeo.suite.coworker,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: org.argeo.suite.coworker
+member: cn=org.argeo.suite.manager,ou=roles,ou=node
+member: uid=coworker,ou=People,dc=example,dc=com
+
+dn: cn=org.argeo.suite.manager,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: org.argeo.suite.manager
+member: uid=manager,ou=People,dc=example,dc=com
+member: uid=root,ou=People,dc=example,dc=com
+
+dn: cn=userAdmin,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: userAdmin
+member: cn=admin,ou=roles,ou=node
+
diff --git a/sdk/log4j.properties b/sdk/log4j.properties
deleted file mode 100644 (file)
index be8ae15..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#log4j.rootLogger=WARN, console
-log4j.rootLogger=WARN, development
-
-## Levels
-log4j.logger.org.argeo=DEBUG
-#log4j.logger.org.argeo.cms.internal.kernel.CmsWorkspaceIndexer=TRACE
-#log4j.logger.org.apache.tika=DEBUG
-#log4j.logger.org.apache.lucene=DEBUG
-#log4j.logger.org.apache.jackrabbit.core=DEBUG
-#log4j.logger.org.apache.jackrabbit.core.session=DEBUG
-#log4j.logger.org.apache.jackrabbit.core.observation=DEBUG
-
-## Appenders
-# default appender
-log4j.appender.console=org.apache.log4j.ConsoleAppender
-log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss} %-5p %m [%t] %c%n
-
-# development appender
-log4j.appender.development=org.apache.log4j.ConsoleAppender
-log4j.appender.development.layout=org.apache.log4j.PatternLayout
-log4j.appender.development.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%16.16t] %5p %m (%F:%L) %c%n
diff --git a/sdk/output-cms-rap.target b/sdk/output-cms-rap.target
new file mode 100644 (file)
index 0000000..5031f01
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?>
+<target name="(output) CMS RAP">
+       <locations>
+               <location path="${project_loc:argeo-suite}/../output/a2/org.argeo.cms" type="Directory"/>
+               <location path="${project_loc:argeo-suite}/../output/a2/swt/org.argeo.cms" type="Directory"/>
+               <location path="${project_loc:argeo-suite}/../output/a2/swt/rap/org.argeo.cms" type="Directory"/>
+               <location type="Target" uri="file:${project_loc:argeo-tp}/sdk/output-argeo-tp-rwt.target"/>
+       </locations>
+</target>
\ No newline at end of file
diff --git a/sdk/output-cms-rcp.target b/sdk/output-cms-rcp.target
new file mode 100644 (file)
index 0000000..7eec71a
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?>
+<target name="(output) CMS RCP">
+       <locations>
+               <location path="${project_loc:argeo-suite}/../output/a2/org.argeo.cms" type="Directory"/>
+               <location path="${project_loc:argeo-suite}/../output/a2/swt/org.argeo.cms" type="Directory"/>
+               <location path="${project_loc:argeo-suite}/../output/a2/swt/rcp/org.argeo.cms" type="Directory"/>
+               <location type="Target" uri="file:${project_loc:argeo-tp}/sdk/output-argeo-tp-swt.target"/>
+       </locations>
+</target>
\ No newline at end of file
diff --git a/sdk/output-suite-rcp.target b/sdk/output-suite-rcp.target
new file mode 100644 (file)
index 0000000..7d766c9
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?>
+<target name="(output) Suite RCP">
+       <locations>
+               <location path="${project_loc:argeo-suite}/../output/a2/org.argeo.cms.jcr" type="Directory"/>
+               <location path="${project_loc:argeo-suite}/../output/a2/swt/org.argeo.cms.jcr" type="Directory"/>
+               <location path="${project_loc:argeo-suite}/../output/a2/org.argeo.suite" type="Directory"/>
+               <location path="${project_loc:argeo-suite}/../output/a2/swt/org.argeo.suite" type="Directory"/>
+               <location type="Target" uri="file:${project_loc:argeo-tp}/sdk/output-argeo-tp-backend.target"/>
+               <location type="Target" uri="file:${project_loc:argeo-suite}/sdk/output-cms-rcp.target"/>
+       </locations>
+</target>
\ No newline at end of file
diff --git a/swt/org.argeo.app.geo.swt/.classpath b/swt/org.argeo.app.geo.swt/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/swt/org.argeo.app.geo.swt/.project b/swt/org.argeo.app.geo.swt/.project
new file mode 100644 (file)
index 0000000..cf7ca92
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.geo.swt</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/swt/org.argeo.app.geo.swt/.settings/org.eclipse.core.resources.prefs b/swt/org.argeo.app.geo.swt/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..99f26c0
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/swt/org.argeo.app.geo.swt/.settings/org.eclipse.jdt.core.prefs b/swt/org.argeo.app.geo.swt/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..62ef348
--- /dev/null
@@ -0,0 +1,9 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
+org.eclipse.jdt.core.compiler.compliance=17
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=17
diff --git a/swt/org.argeo.app.geo.swt/.settings/org.eclipse.pde.core.prefs b/swt/org.argeo.app.geo.swt/.settings/org.eclipse.pde.core.prefs
new file mode 100644 (file)
index 0000000..f29e940
--- /dev/null
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/swt/org.argeo.app.geo.swt/bnd.bnd b/swt/org.argeo.app.geo.swt/bnd.bnd
new file mode 100644 (file)
index 0000000..f8e867c
--- /dev/null
@@ -0,0 +1,7 @@
+Import-Package:\
+org.eclipse.swt,\
+org.argeo.cms.acr,\
+*
+
+Provide-Capability:\
+cms.publish;pkg=org.argeo.app.geo.swt.openlayers;file="*.png,*.js,*.css"
diff --git a/swt/org.argeo.app.geo.swt/build.properties b/swt/org.argeo.app.geo.swt/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java b/swt/org.argeo.app.geo.swt/src/org/argeo/app/geo/swt/MapUiProvider.java
new file mode 100644 (file)
index 0000000..283cbce
--- /dev/null
@@ -0,0 +1,52 @@
+package org.argeo.app.geo.swt;
+
+import org.argeo.api.acr.Content;
+import org.argeo.app.geo.ux.AbstractGeoJsObject;
+import org.argeo.app.geo.ux.OpenLayersMapPart;
+import org.argeo.app.geo.ux.SentinelCloudless;
+import org.argeo.app.ol.GeoJSON;
+import org.argeo.app.ol.Layer;
+import org.argeo.app.ol.OSM;
+import org.argeo.app.ol.TileLayer;
+import org.argeo.app.ol.VectorLayer;
+import org.argeo.app.ol.VectorSource;
+import org.argeo.app.swt.js.SwtBrowserJsPart;
+import org.argeo.app.ux.js.JsClient;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Create map parts. */
+public class MapUiProvider implements SwtUiProvider {
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               JsClient jsClient = new SwtBrowserJsPart(parent, 0, AbstractGeoJsObject.ARGEO_APP_GEO_JS_URL);
+               OpenLayersMapPart mapPart = new OpenLayersMapPart(jsClient, "defaultOverviewMap");
+               mapPart.getMap().getView().setCenter(new int[] { 0, 0 });
+               mapPart.getMap().getView().setZoom(6);
+
+               Layer satelliteLayer = new TileLayer(new SentinelCloudless());
+               satelliteLayer.setMaxResolution(200);
+               mapPart.getMap().addLayer(satelliteLayer);
+
+               TileLayer baseLayer = new TileLayer();
+               baseLayer.setSource(new OSM());
+               baseLayer.setOpacity(0.5);
+               mapPart.getMap().addLayer(baseLayer);
+
+               Layer dataLayer = new VectorLayer(new VectorSource(
+                               "https://openlayers.org/en/v4.6.5/examples/data/geojson/countries.geojson", new GeoJSON()));
+               mapPart.getMap().addLayer(dataLayer);
+
+//             SwtJsMapPart map = new SwtJsMapPart("defaultOverviewMap", parent, 0);
+//             map.setCenter(13.404954, 52.520008); // Berlin
+////           map.setCenter(-74.00597, 40.71427); // NYC
+////           map.addPoint(-74.00597, 40.71427, null);
+//             map.setZoom(6);
+//             // map.addUrlLayer("https://openlayers.org/en/v4.6.5/examples/data/geojson/countries.geojson",
+//             // Format.GEOJSON);
+               return parent;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/.classpath b/swt/org.argeo.app.swt/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/swt/org.argeo.app.swt/.project b/swt/org.argeo.app.swt/.project
new file mode 100644 (file)
index 0000000..11c6368
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.swt</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/swt/org.argeo.app.swt/bnd.bnd b/swt/org.argeo.app.swt/bnd.bnd
new file mode 100644 (file)
index 0000000..1e979d6
--- /dev/null
@@ -0,0 +1,7 @@
+Import-Package:\
+org.eclipse.swt,\
+org.argeo.api.cms.ux,\
+org.argeo.cms.ux.acr,\
+org.argeo.api.app,\
+org.argeo.cms.osgi,\
+*
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/build.properties b/swt/org.argeo.app.swt/build.properties
new file mode 100644 (file)
index 0000000..34d2e4d
--- /dev/null
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/chart/AbstractJsChart.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/chart/AbstractJsChart.java
new file mode 100644 (file)
index 0000000..8cae325
--- /dev/null
@@ -0,0 +1,31 @@
+package org.argeo.app.swt.chart;
+
+import org.argeo.app.swt.js.SwtBrowserJsPart;
+import org.eclipse.swt.widgets.Composite;
+
+/** Base class for charts. */
+public abstract class AbstractJsChart extends SwtBrowserJsPart {
+       private String chartName;
+
+       protected abstract String getJsImplementation();
+
+       public AbstractJsChart(String chartName, Composite parent, int style) {
+               super(parent, style, "/pkg/org.argeo.app.js/chart.html");
+               this.chartName = chartName;
+       }
+
+       @Override
+       protected void init() {
+               // create chart
+               doExecute(getJsChartVar() + " = new " + getJsImplementation() + "('" + chartName + "');");
+       }
+
+       protected String getJsChartVar() {
+               return getJsVarName(chartName);
+       }
+
+       protected void executeChartMethod(String methodCall, Object... args) {
+               executeMethod(getJsChartVar(), methodCall, args);
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/chart/SwtJsBarChart.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/chart/SwtJsBarChart.java
new file mode 100644 (file)
index 0000000..bcfb15f
--- /dev/null
@@ -0,0 +1,62 @@
+package org.argeo.app.swt.chart;
+
+import java.io.StringWriter;
+
+import org.argeo.app.ux.js.JsClient;
+import org.eclipse.swt.widgets.Composite;
+
+import jakarta.json.Json;
+import jakarta.json.stream.JsonGenerator;
+
+public class SwtJsBarChart extends AbstractJsChart {
+
+       public SwtJsBarChart(String chartName, Composite parent, int style) {
+               super(chartName, parent, style);
+       }
+
+       @Override
+       protected String getJsImplementation() {
+               return "globalThis.argeo.app.chart.BarChart";
+       }
+
+       public void setLabels(String[] labels) {
+               executeChartMethod("setLabels(%s)", JsClient.toJsArray(labels));
+       }
+
+       public void addDataset(String label, int[] values) {
+               executeChartMethod("addDataset('%s', %s)", label, JsClient.toJsArray(values));
+       }
+
+       public void setData(String[] labels, String label, int[] values) {
+               executeChartMethod("setData(%s, '%s', %s)", JsClient.toJsArray(labels), label, JsClient.toJsArray(values));
+       }
+
+       public void setDatasets(String[] labels, String[] label, int[][] values) {
+               executeChartMethod("setDatasets(%s, %s)", JsClient.toJsArray(labels), toDatasets(label, values));
+       }
+
+       protected String toDatasets(String[] label, int[][] values) {
+               if (label.length != values.length)
+                       throw new IllegalArgumentException("Arrays must have the same length");
+               StringWriter writer = new StringWriter();
+               JsonGenerator g = Json.createGenerator(writer);
+               g.writeStartArray();
+               for (int i = 0; i < label.length; i++) {
+                       g.writeStartObject();
+                       g.write("label", label[i]);
+                       g.writeStartArray("data");
+                       for (int j = 0; j < values[i].length; j++) {
+                               g.write(values[i][j]);
+                       }
+                       g.writeEnd();// data array
+                       g.writeEnd();// dataset
+               }
+               g.writeEnd();
+               g.close();
+               return writer.toString();
+       }
+
+       public void clearDatasets() {
+               executeChartMethod("clearDatasets()");
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkImageManager.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkImageManager.java
new file mode 100644 (file)
index 0000000..6d22d9f
--- /dev/null
@@ -0,0 +1,130 @@
+package org.argeo.app.swt.docbook;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.DName;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.app.EntityNames;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.ux.Cms2DSize;
+import org.argeo.api.cms.ux.CmsImageManager;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.acr.SvgAttrs;
+import org.argeo.cms.swt.acr.AcrSwtImageManager;
+import org.eclipse.swt.graphics.ImageData;
+
+/** Add DocBook images support to {@link CmsImageManager}. */
+public class DbkImageManager extends AcrSwtImageManager {
+       private Content baseFolder = null;
+
+       public DbkImageManager(Content baseFolder) {
+               this.baseFolder = baseFolder;
+       }
+
+       Content getImageDataNode(Content mediaObjectNode) {
+               return mediaObjectNode.child(DbkType.imageobject).child(DbkType.imagedata);
+       }
+
+//     @Override
+//     public Binary getImageBinary(Node node) {
+//             Node fileNode = null;
+//             if (DbkUtils.isDbk(node, DbkType.mediaobject)) {
+//                     Node imageDataNode = getImageDataNode(node);
+//                     fileNode = getFileNode(imageDataNode);
+//             }
+//             try {
+//                     if (node.isNodeType(NT_FILE)) {
+//                             fileNode = node;
+//                     }
+//                     if (fileNode != null) {
+//                             return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
+//                     } else {
+//                             return null;
+//                     }
+//             } catch (RepositoryException e) {
+//                     throw new JcrException(e);
+//             }
+//     }
+
+       public Cms2DSize getImageSize(Content mediaObjectNode) {
+               Content imageDataNode = getImageDataNode(mediaObjectNode);
+               Content fileNode = getFileNode(imageDataNode);
+               if (fileNode == null)
+                       return new Cms2DSize(0, 0);
+               Cms2DSize intrinsicSize;
+               if (fileNode.containsKey(SvgAttrs.width) && fileNode.containsKey(SvgAttrs.height)) {
+                       int width = fileNode.get(SvgAttrs.width, Integer.class).orElseThrow();
+                       int height = fileNode.get(SvgAttrs.height, Integer.class).orElseThrow();
+                       intrinsicSize = new Cms2DSize(width, height);
+               } else {
+                       try (InputStream in = fileNode.open(InputStream.class)) {
+                               ImageData id = new ImageData(in);
+                               intrinsicSize = updateSize(fileNode, id);
+                       } catch (IOException e) {
+                               throw new RuntimeException("Cannot load file " + fileNode, e);
+                       }
+               }
+               // TODO interpret image data infos
+               return intrinsicSize;
+       }
+
+       protected Cms2DSize updateSize(Content fileNode, ImageData id) {
+               fileNode.addContentClasses(EntityType.box.qName());
+               fileNode.put(SvgAttrs.width, id.width);
+               fileNode.put(SvgAttrs.height, id.height);
+               return new Cms2DSize(id.width, id.height);
+       }
+
+//     @Override
+//     protected void processNewImageFile(Content mediaObjectNode, Content fileNode, ImageData id) throws IOException {
+//             Node imageDataNode = getImageDataNode(mediaObjectNode);
+//             updateSize(fileNode, id);
+//             String filePath = fileNode.getPath();
+//             String relPath = filePath.substring(baseFolder.getPath().length() + 1);
+//             imageDataNode.setProperty(DbkAttr.fileref.name(), relPath);
+//     }
+
+       @Override
+       public String getImageUrl(Content mediaObjectNode) {
+               Content imageDataNode = getImageDataNode(mediaObjectNode);
+               // TODO factorise
+               String fileref = imageDataNode.get(DbkAttr.fileref, String.class).orElse(null);
+               if (fileref == null)
+                       return null;
+               URI fileUri;
+               try {
+                       // FIXME it messes up with the '/'
+                       fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString()));
+               } catch (URISyntaxException | UnsupportedEncodingException e) {
+                       throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e);
+               }
+               if (fileUri.getScheme() != null)
+                       return fileUri.toString();
+               // local
+               Content fileNode = getFileNode(imageDataNode);
+               String url = getDataPathForUrl(fileNode);
+               return url;
+       }
+
+       protected Content getFileNode(Content imageDataNode) {
+               // FIXME make URL use case more robust
+               String fileref = imageDataNode.get(DbkAttr.fileref, String.class).orElse(null);
+               if (fileref == null)
+                       return null;
+               return ((ProvidedContent) baseFolder).getContent(fileref).get();
+       }
+
+       protected Content getMediaFolder() {
+               // TODO check edition status
+               Content mediaFolder = baseFolder.anyOrAddChild(EntityNames.MEDIA, DName.collection.qName());
+               return mediaFolder;
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkImg.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkImg.java
new file mode 100644 (file)
index 0000000..9984209
--- /dev/null
@@ -0,0 +1,65 @@
+package org.argeo.app.swt.docbook;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.Img;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** DocBook specific image area. */
+public class DbkImg extends Img {
+       private static final long serialVersionUID = -6150996708899219074L;
+
+       public DbkImg(Composite parent, int swtStyle, Content imgNode, DbkImageManager imageManager) {
+               super(parent, swtStyle, imgNode, imageManager);
+               // FIXME deal with style and initialisation
+               setStyle((String) null);
+       }
+
+       @Override
+       protected Content getUploadFolder() {
+               Content mediaFolder = ((DbkImageManager) getImageManager()).getMediaFolder();
+               return mediaFolder;
+       }
+
+       @Override
+       protected String getUploadName() {
+               return null;
+       }
+
+       @Override
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
+       }
+
+       @Override
+       protected void setControlLayoutData(Control control) {
+               control.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
+       }
+
+//     @Override
+//     protected FileUploadHandler prepareUpload(FileUploadReceiver receiver) {
+//             FileUploadHandler fileUploadHandler = super.prepareUpload(receiver);
+//             fileUploadHandler.addUploadListener(new FileUploadListener() {
+//
+//                     @Override
+//                     public void uploadProgress(FileUploadEvent event) {
+//                             // TODO Auto-generated method stub
+//
+//                     }
+//
+//                     @Override
+//                     public void uploadFinished(FileUploadEvent event) {
+//                     }
+//
+//                     @Override
+//                     public void uploadFailed(FileUploadEvent event) {
+//                             // TODO Auto-generated method stub
+//
+//                     }
+//             });
+//             return fileUploadHandler;
+//     }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkSectionTitle.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkSectionTitle.java
new file mode 100644 (file)
index 0000000..58dd263
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.app.swt.docbook;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.widgets.EditableText;
+import org.argeo.cms.ux.acr.ContentPart;
+import org.eclipse.swt.widgets.Composite;
+
+/** The title of a section, based on an XML text node. */
+public class DbkSectionTitle extends EditableText implements SwtEditablePart, ContentPart {
+       private static final long serialVersionUID = -1787983154946583171L;
+
+       private final TextSection section;
+
+       public DbkSectionTitle(Composite parent, int swtStyle, Content titleNode) {
+               super(parent, swtStyle);
+               section = (TextSection) TextSection.findSection(this);
+               setData(titleNode);
+       }
+
+       public TextSection getSection() {
+               return section;
+       }
+
+       @Override
+       public Content getContent() {
+               return (Content) getData();
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkTextInterpreter.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkTextInterpreter.java
new file mode 100644 (file)
index 0000000..27a666c
--- /dev/null
@@ -0,0 +1,279 @@
+package org.argeo.app.swt.docbook;
+
+import static org.argeo.app.docbook.DbkAcrUtils.isDbk;
+import static org.argeo.app.docbook.DbkType.para;
+import static org.argeo.app.docbook.DbkType.title;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.List;
+
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.api.acr.Content;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/** Based on HTML with a few Wiki-like shortcuts. */
+public class DbkTextInterpreter implements TextInterpreter {
+
+       private TransformerFactory transformerFactory = TransformerFactory.newDefaultInstance();
+
+//     private String linkCssClass = DbkType.link.name();
+
+       @Override
+       public void write(Content node, String content) {
+               if (isDbk(node, para) || isDbk(node, title)) {
+                       String raw = convertToStorage(node, content);
+                       validateBeforeStoring(raw);
+
+                       String jcrUuid = null;// node.getIdentifier();
+//                                     if (node.hasProperty(Property.JCR_UUID))
+//                                             jcrUuid = node.getProperty(Property.JCR_UUID).getString();
+//                                     else {
+//                                             // TODO use time based
+//                                             jcrUuid = UUID.randomUUID().toString();
+//                                             node.setProperty(Property.JCR_UUID, jcrUuid);
+//                                             node.getSession().save();
+//                                     }
+
+                       StringBuilder namespaces = new StringBuilder();
+                       namespaces.append(" xmlns:dbk=\"http://docbook.org/ns/docbook\"");
+                       namespaces.append(" xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"");
+                       namespaces.append(" xmlns:xlink=\"http://www.w3.org/1999/xlink\"");
+                       raw = "<" + node.getName() + " jcr:uuid=\"" + jcrUuid + "\"" + namespaces + ">" + raw + "</"
+                                       + node.getName() + ">";
+//                                     System.out.println(raw);
+//                                     try (InputStream in = new ByteArrayInputStream(raw.getBytes(StandardCharsets.UTF_8))) {
+//                                             node.getSession().importXML(node.getParent().getPath(), in,
+//                                                             ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+//                                             // node.getSession().save();
+//                                     } catch (IOException e) {
+//                                             throw new IllegalArgumentException("Cannot parse raw content of " + node, e);
+//                                     }
+
+//                                     try {
+//                                             DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+//                                             Document document;
+//                                             try (Reader in = new StringReader(raw)) {
+//                                                     document = documentBuilder.parse(new InputSource(in));
+//                                             }
+//                                             NodeList nl = document.getChildNodes();
+//                                             for (int i = 0; i < nl.getLength(); i++) {
+//                                                     org.w3c.dom.Node n = nl.item(i);
+//                                                     if (node instanceof Text) {
+//
+//                                                     }
+//                                             }
+//                                     } catch (ParserConfigurationException | SAXException | IOException e) {
+//                                             throw new IllegalArgumentException("Cannot parse raw content of " + node, e);
+//                                     }
+
+//                                     Node jcrText;
+//                                     if (!node.hasNode(Jcr.JCR_XMLTEXT))
+//                                             jcrText = node.addNode(Jcr.JCR_XMLTEXT, JcrxType.JCRX_XMLTEXT);
+//                                     else
+//                                             jcrText = node.getNode(Jcr.JCR_XMLTEXT);
+//                                     jcrText.setProperty(Jcr.JCR_XMLCHARACTERS, raw);
+               } else {
+                       throw new IllegalArgumentException("Don't know how to interpret " + node);
+               }
+       }
+
+       @Override
+       public String read(Content item) {
+               String raw = raw(item);
+               return convertFromStorage(item, raw);
+       }
+
+       @Override
+       public String raw(Content node) {
+               if (isDbk(node, para) || isDbk(node, title)) {
+                       try (StringWriter stringWriter = new StringWriter()) {
+                               Source source = node.adapt(Source.class);
+                               Result result = new StreamResult(stringWriter);
+                               transformerFactory.newTransformer().transform(source, result);
+                               return stringWriter.toString();
+                       } catch (TransformerException | IOException e) {
+                               throw new RuntimeException("Could not convert " + node + " to XML", e);
+                       }
+
+//                                     StringBuilder sb = new StringBuilder();
+//                                     readXml(node, sb);
+//                                     NodeIterator nit = node.getNodes();
+//                                     while (nit.hasNext()) {
+//                                             Node child = nit.nextNode();
+//                                             if (child.getName().equals(Jcr.JCR_XMLTEXT)) {
+//                                                     Node jcrText = node.getNode(Jcr.JCR_XMLTEXT);
+//                                                     String txt = jcrText.getProperty(Jcr.JCR_XMLCHARACTERS).getString();
+//                                                     // TODO make it more robust
+//                                                     // txt = txt.replace("\n", "").replace("\t", "");
+//                                                     txt = txt.replace("\t", "  ");
+//                                                     sb.append(txt);
+//                                             } else {
+//                                                     try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+//                                                             child.getSession().exportDocumentView(child.getPath(), out, true, false);
+//                                                             sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8));
+//                                                     } catch (IOException e) {
+//                                                             throw new IllegalStateException("Cannot export " + child, e);
+//                                                     }
+//                                             }
+//                                     }
+//                                     return sb.toString();
+               } else {
+                       throw new IllegalArgumentException("Don't know how to interpret " + node);
+               }
+       }
+
+//     private void readXml(Content node, StringBuilder sb){
+//             
+//             NodeIterator nit = node.getNodes();
+//             while (nit.hasNext()) {
+//                     Node child = nit.nextNode();
+//                     if (child.getName().equals(Jcr.JCR_XMLTEXT)) {
+//                             String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString();
+//                             // TODO make it more robust
+//                             // txt = txt.replace("\n", "").replace("\t", "");
+//                             txt = txt.replace("\t", "  ");
+//                             sb.append(txt);
+//                     } else {
+//                             sb.append('<').append(child.getName());
+//                             PropertyIterator pit = child.getProperties();
+//                             properties: while (pit.hasNext()) {
+//                                     Property p = pit.nextProperty();
+//                                     if (p.getName().startsWith("jcr:"))
+//                                             continue properties;
+//                                     sb.append(' ').append(p.getName()).append("=\"").append(p.getString()).append('\"');
+//                             }
+//                             sb.append('>');
+//                             readXml(child, sb);
+////                           try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+////                                   child.getSession().exportDocumentView(child.getPath(), out, true, false);
+////                                   sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8));
+////                           } catch (IOException e) {
+////                                   throw new IllegalStateException("Cannot export " + child, e);
+////                           }
+//                             sb.append("</").append(child.getName()).append('>');
+//                     }
+//             }
+//     }
+
+       private void readAsSimpleHtml(Content node, StringBuilder sb) {
+               DOMResult result = new DOMResult();
+               try {
+                       Source source = node.adapt(Source.class);
+                       transformerFactory.newTransformer().transform(source, result);
+               } catch (TransformerException e) {
+                       throw new RuntimeException("Could not convert " + node + " to XML", e);
+               }
+
+               NodeList nl = result.getNode().getChildNodes();
+               for (int i = 0; i < nl.getLength(); i++) {
+                       Node n = nl.item(i);
+//                     if (n instanceof Text) {
+//                             Text text = (Text) n;
+//                             sb.append(text.getTextContent());
+//                     } else 
+                       if (n instanceof Element) {
+                               Element elem = (Element) n;
+                               sb.append(elem.getTextContent());
+                       }
+               }
+
+//             NodeIterator nit = node.getNodes();
+//             while (nit.hasNext()) {
+//                     Node child = nit.nextNode();
+//                     if (child.getName().equals(Jcr.JCR_XMLTEXT)) {
+//                             String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString();
+//                             // TODO make it more robust
+//                             // txt = txt.replace("\n", "").replace("\t", "");
+//                             txt = txt.replace("\t", "  ");
+//                             String html = textToSimpleHtml(txt);
+//                             sb.append(html);
+//                     } else if (child.getName().equals(DbkType.link.get())) {
+//                             if (child.hasProperty(DbkAttr.XLINK_HREF)) {
+//                                     String href = child.getProperty(DbkAttr.XLINK_HREF).getString();
+//                                     // TODO deal with other forbidden XML characters?
+//                                     href = href.replace("&", "&amp;");
+//                                     sb.append("<a class='" + linkCssClass + "' href='").append(href).append("'>");
+//                                     readAsSimpleHtml(child, sb);
+//                                     sb.append("</a>");
+//                             }
+//                     } else {
+//                             // ignore
+//                     }
+//             }
+       }
+
+       private String textToSimpleHtml(String raw) {
+               // FIXME the saved data should be corrected instead.
+               if (raw.indexOf('&') >= 0) {
+                       raw = raw.replace("&", "&amp;");
+               }
+               if (raw.indexOf('<') >= 0) {
+                       raw = raw.replace("<", "&lt;");
+               }
+               if (raw.indexOf('>') >= 0) {
+                       raw = raw.replace(">", "&gt;");
+               }
+               if (raw.indexOf('\"') >= 0) {
+                       raw = raw.replace("\"", "&quot;");
+               }
+               if (raw.indexOf('\'') >= 0) {
+                       raw = raw.replace("\'", "&apos;");
+               }
+//             raw = "<span style='text-align:justify'>" + raw + "</span>";
+               if (raw.length() == 0)
+                       return raw;
+               try (StringReader reader = new StringReader(raw)) {
+                       List<String> lines = IOUtils.readLines(reader);
+                       if (lines.size() == 1)
+                               return lines.get(0);
+                       StringBuilder sb = new StringBuilder(raw.length() + lines.size() * BR_LENGTH);
+                       for (int i = 0; i < lines.size(); i++) {
+                               if (i != 0)
+                                       sb.append("<br/>");
+                               sb.append(lines.get(i));
+                       }
+                       return sb.toString();
+               }
+       }
+
+       final static int BR_LENGTH = "<br/>".length();
+
+       public String readSimpleHtml(Content item) {
+               StringBuilder sb = new StringBuilder();
+//                     sb.append("<div style='text-align: justify;'>");
+               readAsSimpleHtml(item, sb);
+//                     sb.append("</div>");
+//                     System.out.println(sb);
+               return sb.toString();
+       }
+
+       // EXTENSIBILITY
+       /**
+        * To be overridden, in order to make sure that only valid strings are being
+        * stored.
+        */
+       protected void validateBeforeStoring(String raw) {
+       }
+
+       /** To be overridden, in order to support additional formatting. */
+       protected String convertToStorage(Content item, String content) {
+               return content;
+
+       }
+
+       /** To be overridden, in order to support additional formatting. */
+       protected String convertFromStorage(Content item, String content) {
+               return content;
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkVideo.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DbkVideo.java
new file mode 100644 (file)
index 0000000..6c42146
--- /dev/null
@@ -0,0 +1,216 @@
+package org.argeo.app.swt.docbook;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ldap.NamingUtils;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.app.docbook.DbkAcrUtils;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.acr.SwtSection;
+import org.argeo.cms.swt.acr.SwtSectionPart;
+import org.argeo.cms.swt.widgets.StyledControl;
+import org.argeo.cms.ux.acr.ContentPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+public class DbkVideo extends StyledControl implements SwtSectionPart, ContentPart {
+       private static final long serialVersionUID = -8753232181570351880L;
+       private SwtSection section;
+
+       private int width = 640;
+       private int height = 360;
+
+       private boolean editable;
+
+       public DbkVideo(Composite parent, int style, Content node) {
+               this(SwtSection.findSection(parent), parent, style, node);
+       }
+
+       DbkVideo(SwtSection section, Composite parent, int style, Content node) {
+               super(parent, style);
+               editable = !(SWT.READ_ONLY == (style & SWT.READ_ONLY));
+               this.section = section;
+               // set data before setting style since it creates the control
+               setData(node);
+               setStyle(DbkType.videoobject.name());
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               Content mediaobject = getContent();
+               Composite wrapper = new Composite(box, SWT.NONE);
+               wrapper.setLayout(CmsSwtUtils.noSpaceGridLayout());
+
+               Composite browserC = new Composite(wrapper, SWT.NONE);
+               browserC.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               GridData gd = new GridData(SWT.CENTER, SWT.FILL, true, true);
+               gd.widthHint = getWidth();
+               gd.heightHint = getHeight();
+               browserC.setLayoutData(gd);
+//             wrapper.setLayoutData(CmsUiUtils.fillAll());
+               Browser browser = new Browser(browserC, SWT.NONE);
+
+               if (editable) {
+                       Composite editor = new Composite(wrapper, SWT.BORDER);
+                       editor.setLayout(new GridLayout(3, false));
+                       editor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+                       String fileref = DbkAcrUtils.getMediaFileref(mediaobject);
+                       Text text = new Text(editor, SWT.SINGLE);
+                       if (fileref != null)
+                               text.setText(fileref);
+                       else
+                               text.setMessage("Embed URL of the video");
+                       text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+                       Button updateB = new Button(editor, SWT.FLAT);
+                       updateB.setText("Update");
+                       updateB.addSelectionListener(new Selected() {
+
+                               private static final long serialVersionUID = -8234047511858456222L;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       Content videodata = mediaobject.child(DbkType.videoobject).child(DbkType.videodata);
+                                       String txt = text.getText();
+                                       URI uri;
+                                       try {
+                                               uri = new URI(txt);
+                                       } catch (URISyntaxException e1) {
+                                               text.setText("");
+                                               text.setMessage("Invalid URL");
+                                               return;
+                                       }
+
+                                       // Transform watch URL in embed
+                                       // YouTube
+                                       String videoId = null;
+                                       if ("www.youtube.com".equals(uri.getHost()) || "youtube.com".equals(uri.getHost())
+                                                       || "youtu.be".equals(uri.getHost())) {
+                                               if ("www.youtube.com".equals(uri.getHost()) || "youtube.com".equals(uri.getHost())) {
+                                                       if ("/watch".equals(uri.getPath())) {
+                                                               Map<String, List<String>> map = NamingUtils.queryToMap(uri);
+                                                               videoId = map.get("v").get(0);
+                                                       }
+                                               } else if ("youtu.be".equals(uri.getHost())) {
+                                                       videoId = uri.getPath().substring(1);
+                                               }
+                                               if (videoId != null) {
+                                                       try {
+                                                               uri = new URI("https://www.youtube.com/embed/" + videoId);
+                                                               text.setText(uri.toString());
+                                                       } catch (URISyntaxException e1) {
+                                                               throw new IllegalStateException(e1);
+                                                       }
+                                               }
+                                       }
+
+                                       // Vimeo
+                                       if ("vimeo.com".equals(uri.getHost())) {
+                                               videoId = uri.getPath().substring(1);
+                                               if (videoId != null) {
+                                                       try {
+                                                               uri = new URI("https://player.vimeo.com/video/" + videoId);
+                                                               text.setText(uri.toString());
+                                                       } catch (URISyntaxException e1) {
+                                                               throw new IllegalStateException(e1);
+                                                       }
+                                               }
+                                       }
+
+                                       videodata.put(DbkAttr.fileref, uri.toString());
+                                       // TODO better integrate it in the edition lifecycle
+//                                     videodata.getSession().save();
+                                       load(browser);
+
+                               }
+                       });
+
+                       Button deleteB = new Button(editor, SWT.FLAT);
+                       deleteB.setText("Delete");
+                       deleteB.addSelectionListener(new Selected() {
+
+                               private static final long serialVersionUID = -7552456185687361642L;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       mediaobject.remove();
+//                                     mediaobject.getSession().save();
+                                       dispose();
+                                       getSection().getParent().layout(true, true);
+
+                               }
+                       });
+               }
+
+               // TODO caption
+               return browser;
+       }
+
+       public void load(Control control) {
+               if (control instanceof Browser) {
+                       Browser browser = (Browser) control;
+//                     getNode().getSession();
+                       String fileref = DbkAcrUtils.getMediaFileref(getContent());
+                       if (fileref != null) {
+                               // TODO manage self-hosted videos
+                               // TODO for YouTube videos, check whether the URL starts with
+                               // https://www.youtube.com/embed/ and not https://www.youtube.com/watch?v=
+                               StringBuilder html = new StringBuilder();
+                               html.append(
+                                               "<iframe frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture\" allowfullscreen=\"true\"");
+                               // TODO make size configurable
+                               html.append("width=\"").append(width).append("\" height=\"").append(height).append("\" ");
+                               html.append("src=\"").append(fileref).append("\" ");
+                               html.append("/>");
+                               browser.setText(html.toString());
+                       }
+               }
+       }
+
+       @Override
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, true, true));
+       }
+
+       @Override
+       protected void setControlLayoutData(Control control) {
+               control.setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       @Override
+       public Content getContent() {
+               return (Content) getData();
+       }
+
+       @Override
+       public String getPartId() {
+               return ((ProvidedContent) getContent()).getSessionLocalId();
+       }
+
+       @Override
+       public SwtSection getSection() {
+               return section;
+       }
+
+       public int getWidth() {
+               return width;
+       }
+
+       public int getHeight() {
+               return height;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DocBookViewer.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/DocBookViewer.java
new file mode 100644 (file)
index 0000000..594fe3a
--- /dev/null
@@ -0,0 +1,270 @@
+package org.argeo.app.swt.docbook;
+
+import static org.argeo.app.docbook.DbkAcrUtils.isDbk;
+import static org.argeo.app.docbook.DbkType.para;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.ux.Cms2DSize;
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.acr.AbstractPageViewer;
+import org.argeo.cms.swt.acr.SwtSection;
+import org.argeo.cms.swt.acr.SwtSectionPart;
+import org.argeo.cms.swt.widgets.EditableText;
+import org.argeo.cms.swt.widgets.StyledControl;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Displays DocBook content. */
+public class DocBookViewer extends AbstractPageViewer {
+
+       private TextInterpreter textInterpreter = new DbkTextInterpreter();
+       private DbkImageManager imageManager;
+
+       private TextSection mainSection;
+
+       private boolean showMainTitle = true;
+
+       private Integer maxMediaWidth = null;
+       private String defaultSectionStyle;
+
+       public DocBookViewer(Composite parent, int style, Content item, CmsEditable cmsEditable) {
+               super(parent, style, cmsEditable);
+               imageManager = new DbkImageManager(item);
+
+               for (Content child : item) {
+                       if (child.hasContentClass(DbkType.article)) {
+                               if (mainSection != null)
+                                       throw new IllegalStateException("Main section already created");
+                               mainSection = new TextSection(parent, 0, child);
+                               mainSection.setLayoutData(CmsSwtUtils.fillAll());
+                       }
+               }
+       }
+
+       @Override
+       protected void refresh(Control control) {
+               if (!(control instanceof SwtSection))
+                       return;
+//             long begin = System.currentTimeMillis();
+               SwtSection section = (SwtSection) control;
+               if (section instanceof TextSection) {
+                       CmsSwtUtils.clear(mainSection);
+                       refreshTextSection(mainSection);
+
+               }
+//             long duration = System.currentTimeMillis() - begin;
+//             System.out.println(duration + " ms - " + DbkUtils.getTitle(section.getNode()));
+
+       }
+
+       protected void refreshTextSection(TextSection section) {
+               Content sectionContent = section.getContent();
+               // Style
+               Optional<String> roleAttr = sectionContent.get(DbkAttr.role, String.class);
+               String style = roleAttr.orElse(section.getDefaultTextStyle());
+               if (style != null)
+                       CmsSwtUtils.style(section, style);
+
+               // Title
+               Optional<Content> titleContent = sectionContent.soleChild(DbkType.title.qName());
+
+               if (titleContent.isPresent()) {
+                       boolean showTitle = getMainSection() == section ? showMainTitle : true;
+                       if (showTitle) {
+                               if (section.getHeader() == null)
+                                       section.createHeader();
+                               DbkSectionTitle title = newSectionTitle(section, titleContent.get());
+                               title.setLayoutData(CmsSwtUtils.fillWidth());
+                               updateContent(title);
+                       }
+               }
+
+               boolean processingSubSections = false;
+               for (Content child : section.getContent()) {
+                       if (child.hasContentClass(DbkType.section)) {
+                               processingSubSections = true;
+                               TextSection childSection = newTextSection(section, child); // new TextSection(section, 0, child);
+                               childSection.setLayoutData(CmsSwtUtils.fillWidth());
+                               refreshTextSection(childSection);
+                       } else {
+                               if (processingSubSections)
+                                       throw new IllegalStateException(child + " is below a subsection");
+                               SwtSectionPart sectionPart = null;
+                               if (child.hasContentClass(DbkType.para)) {
+                                       sectionPart = newParagraph(section, child);
+                               } else if (child.hasContentClass(DbkType.mediaobject)) {
+                                       if (child.hasChild(DbkType.imageobject)) {
+                                               sectionPart = newImg(section, child);
+                                       } else if (child.hasChild(DbkType.videoobject)) {
+                                               sectionPart = newVideo(section, child);
+                                       } else {
+                                               throw new IllegalArgumentException("Unsupported media object " + child);
+                                       }
+                               } else if (isDbk(child, DbkType.info)) {
+                                       // TODO enrich UI based on info
+                               } else if (isDbk(child, DbkType.title)) {
+                                       // already managed
+                                       // TODO check that it is first?
+                               } else {
+                                       throw new IllegalArgumentException("Unsupported type for " + child);
+                               }
+                               if (sectionPart != null && sectionPart instanceof Control)
+                                       ((Control) sectionPart).setLayoutData(CmsSwtUtils.fillWidth());
+                       }
+               }
+       }
+
+       protected void updateContent(SwtEditablePart part) {
+               if (part instanceof SwtSectionPart) {
+                       SwtSectionPart sectionPart = (SwtSectionPart) part;
+                       Content partContent = sectionPart.getContent();
+
+                       if (part instanceof StyledControl && (sectionPart.getSection() instanceof TextSection)) {
+                               TextSection section = (TextSection) sectionPart.getSection();
+                               StyledControl styledControl = (StyledControl) part;
+                               if (isDbk(partContent, para)) {
+                                       Optional<String> roleAttr = partContent.get(DbkAttr.role.qName(), String.class);
+                                       String style = roleAttr.orElse(section.getDefaultTextStyle());
+                                       styledControl.setStyle(style);
+                               }
+                       }
+                       // use control AFTER setting style, since it may have been reset
+
+                       if (part instanceof EditableText) {
+                               EditableText paragraph = (EditableText) part;
+                               if (paragraph == getEdited())
+                                       paragraph.setText(textInterpreter.raw(partContent));
+                               else
+                                       paragraph.setText(textInterpreter.readSimpleHtml(partContent));
+                               // paragraph.setText(textInterpreter.readSimpleHtml(partContent));
+
+                       } else if (part instanceof DbkImg) {
+                               DbkImg editableImage = (DbkImg) part;
+                               imageManager.load(partContent, part.getControl(), editableImage.getPreferredImageSize(), null);
+                       } else if (part instanceof DbkVideo) {
+                               DbkVideo video = (DbkVideo) part;
+                               video.load(part.getControl());
+                       }
+               } else if (part instanceof DbkSectionTitle) {
+                       DbkSectionTitle title = (DbkSectionTitle) part;
+                       title.setStyle(title.getSection().getTitleStyle());
+                       // use control AFTER setting style
+                       if (title == getEdited())
+                               title.setText(textInterpreter.read(title.getContent()));
+                       else
+                               title.setText(textInterpreter.readSimpleHtml(title.getContent()));
+               }
+       }
+
+       /** To be overridden in order to provide additional SectionPart types */
+       protected TextSection newTextSection(SwtSection section, Content node) {
+               return new TextSection(section, SWT.NONE, node);
+       }
+
+       protected Paragraph newParagraph(TextSection parent, Content node) {
+               Paragraph paragraph = new Paragraph(parent, parent.getStyle(), node);
+               updateContent(paragraph);
+               paragraph.setLayoutData(CmsSwtUtils.fillWidth());
+               paragraph.setMouseListener(getMouseListener());
+               paragraph.setFocusListener(getFocusListener());
+               return paragraph;
+       }
+
+       protected DbkSectionTitle newSectionTitle(TextSection parent, Content titleNode) {
+               int style = parent.getStyle();
+               Composite titleParent = newSectionHeader(parent);
+               if (parent.isTitleReadOnly())
+                       style = style | SWT.READ_ONLY;
+               DbkSectionTitle title = new DbkSectionTitle(titleParent, style, titleNode);
+               updateContent(title);
+               title.setMouseListener(getMouseListener());
+               title.setFocusListener(getFocusListener());
+               return title;
+       }
+
+       protected DbkImg newImg(TextSection parent, Content node) {
+               DbkImg img = new DbkImg(parent, parent.getStyle(), node, imageManager);
+               GridData imgGd;
+               if (maxMediaWidth != null) {
+                       imgGd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+                       imgGd.widthHint = maxMediaWidth;
+                       img.setPreferredSize(new Cms2DSize(maxMediaWidth, 0));
+               } else {
+                       imgGd = CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT);
+               }
+               img.setLayoutData(imgGd);
+               updateContent(img);
+               img.setMouseListener(getMouseListener());
+               img.setFocusListener(getFocusListener());
+               return img;
+       }
+
+       protected DbkVideo newVideo(TextSection parent, Content node) {
+               DbkVideo video = new DbkVideo(parent, getCmsEditable().canEdit() ? SWT.NONE : SWT.READ_ONLY, node);
+               GridData gd;
+               if (maxMediaWidth != null) {
+                       gd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+                       // TODO, manage size
+//                             gd.widthHint = maxMediaWidth;
+//                             gd.heightHint = (int) (gd.heightHint * 0.5625);
+               } else {
+                       gd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+//                             gd.widthHint = video.getWidth();
+//                             gd.heightHint = video.getHeight();
+               }
+               video.setLayoutData(gd);
+               updateContent(video);
+               return video;
+       }
+
+       /**
+        * To be overridden in order to provide additional processing at the section
+        * level.
+        * 
+        * @return the parent to use for the {@link DbkSectionTitle}, by default
+        *         {@link SwtSection#getHeader()}
+        */
+       protected Composite newSectionHeader(TextSection section) {
+               return section.getHeader();
+       }
+
+       protected List<String> getAvailableStyles(SwtEditablePart editablePart) {
+               return new ArrayList<>();
+       }
+
+       public TextSection getMainSection() {
+               return mainSection;
+       }
+
+       public void setShowMainTitle(boolean showMainTitle) {
+               this.showMainTitle = showMainTitle;
+       }
+
+       public String getDefaultSectionStyle() {
+               return defaultSectionStyle;
+       }
+
+       public void setDefaultSectionStyle(String defaultSectionStyle) {
+               this.defaultSectionStyle = defaultSectionStyle;
+       }
+
+       public void setMaxMediaWidth(Integer maxMediaWidth) {
+               this.maxMediaWidth = maxMediaWidth;
+       }
+
+       @Override
+       public Control getControl() {
+               return mainSection;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/Paragraph.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/Paragraph.java
new file mode 100644 (file)
index 0000000..60bfc77
--- /dev/null
@@ -0,0 +1,50 @@
+package org.argeo.app.swt.docbook;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtSectionPart;
+import org.argeo.cms.swt.widgets.EditableText;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/** An editable paragraph. */
+public class Paragraph extends EditableText implements SwtSectionPart {
+       private static final long serialVersionUID = 3746457776229542887L;
+
+       private final TextSection section;
+
+       public Paragraph(TextSection section, int style, Content node) {
+               super(section, style);
+               this.section = section;
+               setData(node);
+               CmsSwtUtils.style(this, DbkType.para.name());
+       }
+
+       public TextSection getSection() {
+               return section;
+       }
+
+       @Override
+       protected Label createLabel(Composite box, String style) {
+               Label lbl = super.createLabel(box, style);
+               CmsSwtUtils.disableMarkupValidation(lbl);
+               return lbl;
+       }
+
+       @Override
+       public String getPartId() {
+               return ((ProvidedContent) getContent()).getSessionLocalId();
+       }
+
+       @Override
+       public Content getContent() {
+               return (Content) getData();
+       }
+
+       @Override
+       public String toString() {
+               return "Paragraph #" + getPartId();
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextInterpreter.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextInterpreter.java
new file mode 100644 (file)
index 0000000..0470a6d
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.app.swt.docbook;
+
+import org.argeo.api.acr.Content;
+
+/** Convert from/to data layer to/from presentation layer. */
+public interface TextInterpreter {
+       String raw(Content content);
+
+       String read(Content content);
+
+       String readSimpleHtml(Content content);
+
+       void write(Content content, String txt);
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextSection.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/docbook/TextSection.java
new file mode 100644 (file)
index 0000000..e062ad2
--- /dev/null
@@ -0,0 +1,78 @@
+package org.argeo.app.swt.docbook;
+
+import org.argeo.api.acr.Content;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtSection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+
+/** An editable section. */
+public class TextSection extends SwtSection {
+       private static final long serialVersionUID = -8625209546243220689L;
+       private String defaultTextStyle = DbkType.para.name();
+       private String titleStyle;
+
+       private final boolean flat;
+
+       private boolean titleReadOnly = false;
+
+       private final int level;
+
+       public TextSection(Composite parent, int style, Content node) {
+               this(parent, findSection(parent), style, node);
+       }
+
+       public TextSection(TextSection section, int style, Content node) {
+               this(section, section.getParentSection(), style, node);
+       }
+
+       private TextSection(Composite parent, SwtSection parentSection, int style, Content node) {
+               super(parent, parentSection, style, node);
+               flat = SWT.FLAT == (style & SWT.FLAT);
+               if (parentSection instanceof TextSection) {
+                       level = ((TextSection) parentSection).getLevel() + 1;
+               } else {
+                       level = 0;
+               }
+               CmsSwtUtils.style(this, DbkType.section.name());
+       }
+
+       public String getDefaultTextStyle() {
+               return defaultTextStyle;
+       }
+
+       public boolean isFlat() {
+               return flat;
+       }
+
+       /** The level of this section, similar to h1, h2, etc. in HTML. */
+       public int getLevel() {
+               return level;
+       }
+
+       public String getTitleStyle() {
+               if (titleStyle != null)
+                       return titleStyle;
+               // TODO make base H styles configurable
+//             Integer relativeDepth = getRelativeDepth();
+//             System.out.println("Level: " + getLevel());
+               return "h" + (getLevel() + 1);
+       }
+
+       public void setDefaultTextStyle(String defaultTextStyle) {
+               this.defaultTextStyle = defaultTextStyle;
+       }
+
+       public void setTitleStyle(String titleStyle) {
+               this.titleStyle = titleStyle;
+       }
+
+       public boolean isTitleReadOnly() {
+               return titleReadOnly;
+       }
+
+       public void setTitleReadOnly(boolean titleReadOnly) {
+               this.titleReadOnly = titleReadOnly;
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditableLink.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditableLink.java
new file mode 100644 (file)
index 0000000..9d14ba0
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.app.swt.forms;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** Editable String that displays a browsable link when read-only */
+public class EditableLink extends EditablePropertyString implements SwtEditablePart {
+       private static final long serialVersionUID = 5055000749992803591L;
+
+       private String type;
+       private String message;
+       private boolean readOnly;
+
+       public EditableLink(Composite parent, int style, Content node, QName propertyName, String type, String message) {
+               super(parent, style, node, propertyName, message);
+               this.message = message;
+               this.type = type;
+
+               readOnly = SWT.READ_ONLY == (style & SWT.READ_ONLY);
+               if (node.containsKey(propertyName)) {
+                       this.setStyle(FormStyle.propertyText.style());
+                       this.setText(node.attr(propertyName));
+               } else {
+                       this.setStyle(FormStyle.propertyMessage.style());
+                       this.setText("");
+               }
+       }
+
+       public void setText(String text) {
+               Control child = getControl();
+               if (child instanceof Label) {
+                       Label lbl = (Label) child;
+                       if (EclipseUiUtils.isEmpty(text))
+                               lbl.setText(message);
+                       else if (readOnly)
+                               setLinkValue(lbl, text);
+                       else
+                               // if canEdit() we put only the value with no link
+                               // to avoid glitches of the edition life cycle
+                               lbl.setText(text);
+               } else if (child instanceof Text) {
+                       Text txt = (Text) child;
+                       if (EclipseUiUtils.isEmpty(text)) {
+                               txt.setText("");
+                               txt.setMessage(message);
+                       } else
+                               txt.setText(text);
+               }
+       }
+
+       private void setLinkValue(Label lbl, String text) {
+               if (FormStyle.email.style().equals(type))
+                       lbl.setText(FormUtils.getMailLink(text));
+               else if (FormStyle.phone.style().equals(type))
+                       lbl.setText(FormUtils.getPhoneLink(text));
+               else if (FormStyle.website.style().equals(type))
+                       lbl.setText(FormUtils.getUrlLink(text));
+               else if (FormStyle.facebook.style().equals(type) || FormStyle.instagram.style().equals(type)
+                               || FormStyle.linkedIn.style().equals(type) || FormStyle.twitter.style().equals(type))
+                       lbl.setText(FormUtils.getUrlLink(text));
+       }
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditableMultiStringProperty.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditableMultiStringProperty.java
new file mode 100644 (file)
index 0000000..6145366
--- /dev/null
@@ -0,0 +1,261 @@
+package org.argeo.app.swt.forms;
+
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.acr.ContentStyledControl;
+import org.argeo.cms.swt.dialogs.CmsMessageDialog;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** Display, add or remove values from a list in a CMS context */
+public class EditableMultiStringProperty extends ContentStyledControl implements SwtEditablePart {
+       private static final long serialVersionUID = -7044614381252178595L;
+
+       private QName propertyName;
+       private String message;
+       // TODO implement the ability to provide a list of possible values
+//     private String[] possibleValues;
+       private boolean canEdit;
+       private SelectionListener removeValueSL;
+       private List<String> values;
+
+       // TODO manage within the CSS
+       private int rowSpacing = 5;
+       private int rowMarging = 0;
+       private int oneValueMargingRight = 5;
+       private int btnWidth = 16;
+       private int btnHeight = 16;
+       private int btnHorizontalIndent = 3;
+
+       public EditableMultiStringProperty(Composite parent, int style, Content node, QName propertyName,
+                       List<String> values, String[] possibleValues, String addValueMsg,
+                       SelectionListener removeValueSelectionListener) {
+               super(parent, style, node);
+
+               this.propertyName = propertyName;
+               this.values = values;
+//             this.possibleValues = new String[] { "Un", "Deux", "Trois" };
+               this.message = addValueMsg;
+               this.canEdit = removeValueSelectionListener != null;
+               this.removeValueSL = removeValueSelectionListener;
+       }
+
+       public List<String> getValues() {
+               return values;
+       }
+
+       public void setValues(List<String> values) {
+               this.values = values;
+       }
+
+       // Row layout items do not need explicit layout data
+       protected void setControlLayoutData(Control control) {
+       }
+
+       /** To be overridden */
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(CmsSwtUtils.fillWidth());
+       }
+
+       @Override
+       public Control getControl() {
+               return super.getControl();
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               Composite row = new Composite(box, SWT.NO_FOCUS);
+               row.setLayoutData(EclipseUiUtils.fillAll());
+
+               RowLayout rl = new RowLayout(SWT.HORIZONTAL);
+               rl.wrap = true;
+               rl.spacing = rowSpacing;
+               rl.marginRight = rl.marginLeft = rl.marginBottom = rl.marginTop = rowMarging;
+               row.setLayout(rl);
+
+               if (values != null) {
+                       for (final String value : values) {
+                               if (canEdit)
+                                       createRemovableValue(row, SWT.SINGLE, value);
+                               else
+                                       createValueLabel(row, SWT.SINGLE, value);
+                       }
+               }
+
+               if (!canEdit)
+                       return row;
+               else if (isEditing())
+                       return createText(row, style);
+               else
+                       return createLabel(row, style);
+       }
+
+       /**
+        * Override to provide specific layout for the existing values, typically adding
+        * a pound (#) char for tags or anchor info for browsable links. We assume the
+        * parent composite already has a layout and it is the caller responsibility to
+        * apply corresponding layout data
+        */
+       protected Label createValueLabel(Composite parent, int style, String value) {
+               Label label = new Label(parent, style);
+               label.setText("#" + value);
+               CmsSwtUtils.markup(label);
+               CmsSwtUtils.style(label, FormStyle.propertyText.style());
+               return label;
+       }
+
+       private Composite createRemovableValue(Composite parent, int style, String value) {
+               Composite valCmp = new Composite(parent, SWT.NO_FOCUS);
+               GridLayout gl = EclipseUiUtils.noSpaceGridLayout(new GridLayout(2, false));
+               gl.marginRight = oneValueMargingRight;
+               valCmp.setLayout(gl);
+
+               createValueLabel(valCmp, SWT.WRAP, value);
+
+               Button deleteBtn = new Button(valCmp, SWT.FLAT);
+               deleteBtn.setData(FormConstants.LINKED_VALUE, value);
+               deleteBtn.addSelectionListener(removeValueSL);
+               CmsSwtUtils.style(deleteBtn, FormStyle.delete.style() + FormStyle.BUTTON_SUFFIX);
+               GridData gd = new GridData();
+               gd.heightHint = btnHeight;
+               gd.widthHint = btnWidth;
+               gd.horizontalIndent = btnHorizontalIndent;
+               deleteBtn.setLayoutData(gd);
+
+               return valCmp;
+       }
+
+       protected Text createText(Composite box, String style) {
+               final Text text = new Text(box, getStyle());
+               // The "add new value" text is not meant to change, so we can set it on
+               // creation
+               text.setMessage(message);
+               CmsSwtUtils.style(text, style);
+               text.setFocus();
+
+               text.addTraverseListener(new TraverseListener() {
+                       private static final long serialVersionUID = 1L;
+
+                       public void keyTraversed(TraverseEvent e) {
+                               if (e.keyCode == SWT.CR) {
+                                       addValue(text);
+                                       e.doit = false;
+                               }
+                       }
+               });
+
+               // The OK button does not work with the focusOut listener
+               // because focus out is called before the OK button is pressed
+
+               // // we must call layout() now so that the row data can compute the
+               // height
+               // // of the other controls.
+               // text.getParent().layout();
+               // int height = text.getSize().y;
+               //
+               // Button okBtn = new Button(box, SWT.BORDER | SWT.PUSH | SWT.BOTTOM);
+               // okBtn.setText("OK");
+               // RowData rd = new RowData(SWT.DEFAULT, height - 2);
+               // okBtn.setLayoutData(rd);
+               //
+               // okBtn.addSelectionListener(new SelectionAdapter() {
+               // private static final long serialVersionUID = 2780819012423622369L;
+               //
+               // @Override
+               // public void widgetSelected(SelectionEvent e) {
+               // addValue(text);
+               // }
+               // });
+
+               return text;
+       }
+
+       /** Performs the real addition, overwrite to make further sanity checks */
+       protected void addValue(Text text) {
+               String value = text.getText();
+               String errMsg = null;
+
+               if (EclipseUiUtils.isEmpty(value))
+                       return;
+
+               if (values.contains(value))
+                       errMsg = "Dupplicated value: " + value + ", please correct and try again";
+               if (errMsg != null)
+                       CmsMessageDialog.openError("Addition not allowed: " + errMsg);
+               else {
+                       values.add(value);
+                       Composite newCmp = createRemovableValue(text.getParent(), SWT.SINGLE, value);
+                       newCmp.moveAbove(text);
+                       text.setText("");
+                       newCmp.getParent().layout();
+               }
+       }
+
+       protected Label createLabel(Composite box, String style) {
+               if (canEdit) {
+                       Label lbl = new Label(box, getStyle());
+                       lbl.setText(message);
+                       CmsSwtUtils.style(lbl, style);
+                       CmsSwtUtils.markup(lbl);
+                       if (mouseListener != null)
+                               lbl.addMouseListener(mouseListener);
+                       return lbl;
+               }
+               return null;
+       }
+
+       protected void clear(boolean deep) {
+               Control child = getControl();
+               if (deep)
+                       super.clear(deep);
+               else {
+                       child.getParent().dispose();
+               }
+       }
+
+       public void setText(String text) {
+               Control child = getControl();
+               if (child instanceof Label) {
+                       Label lbl = (Label) child;
+                       if (canEdit)
+                               lbl.setText(text);
+                       else
+                               lbl.setText("");
+               } else if (child instanceof Text) {
+                       Text txt = (Text) child;
+                       txt.setText(text);
+               }
+       }
+
+       public synchronized void startEditing() {
+               CmsSwtUtils.style(getControl(), FormStyle.propertyText.style());
+//             getControl().setData(STYLE, FormStyle.propertyText.style());
+               super.startEditing();
+       }
+
+       public synchronized void stopEditing() {
+               CmsSwtUtils.style(getControl(), FormStyle.propertyMessage.style());
+//             getControl().setData(STYLE, FormStyle.propertyMessage.style());
+               super.stopEditing();
+       }
+
+       public QName getPropertyName() {
+               return propertyName;
+       }
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditablePropertyDate.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditablePropertyDate.java
new file mode 100644 (file)
index 0000000..fb78fbd
--- /dev/null
@@ -0,0 +1,305 @@
+package org.argeo.app.swt.forms;
+
+import java.text.DateFormat;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoField;
+import java.time.temporal.TemporalAccessor;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Optional;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.acr.ContentStyledControl;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DateTime;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/** CMS form part to display and edit a date */
+public class EditablePropertyDate extends ContentStyledControl implements SwtEditablePart {
+       private static final long serialVersionUID = 2500215515778162468L;
+
+       // Context
+       private QName propertyName;
+       private String message;
+       private DateTimeFormatter dateFormat;
+
+       // UI Objects
+       private Text dateTxt;
+       private Button openCalBtn;
+
+       // TODO manage within the CSS
+       private int fieldBtnSpacing = 5;
+
+       /**
+        * 
+        * @param parent
+        * @param style
+        * @param node
+        * @param propertyName
+        * @param message
+        * @param dateFormat   provide a {@link DateFormat} as contract to be able to
+        *                     read/write dates as strings
+        * @throws RepositoryException
+        */
+       public EditablePropertyDate(Composite parent, int style, Content node, QName propertyName, String message,
+                       DateTimeFormatter dateFormat) {
+               super(parent, style, node);
+
+               this.propertyName = propertyName;
+               this.message = message;
+               this.dateFormat = dateFormat;
+
+               Optional<Instant> instant = node.get(propertyName, Instant.class);
+               if (instant.isPresent()) {
+                       this.setStyle(FormStyle.propertyText.style());
+                       this.setText(dateFormat.format(instant.get()));
+               } else {
+                       this.setStyle(FormStyle.propertyMessage.style());
+                       this.setText(message);
+               }
+       }
+
+       public void setText(String text) {
+               Control child = getControl();
+               if (child instanceof Label) {
+                       Label lbl = (Label) child;
+                       if (EclipseUiUtils.isEmpty(text))
+                               lbl.setText(message);
+                       else
+                               lbl.setText(text);
+               } else if (child instanceof Text) {
+                       Text txt = (Text) child;
+                       if (EclipseUiUtils.isEmpty(text)) {
+                               txt.setText("");
+                       } else
+                               txt.setText(text);
+               }
+       }
+
+       public synchronized void startEditing() {
+               // if (dateTxt != null && !dateTxt.isDisposed())
+               CmsSwtUtils.style(getControl(), FormStyle.propertyText);
+//             getControl().setData(STYLE, FormStyle.propertyText.style());
+               super.startEditing();
+       }
+
+       public synchronized void stopEditing() {
+               if (EclipseUiUtils.isEmpty(dateTxt.getText()))
+                       CmsSwtUtils.style(getControl(), FormStyle.propertyMessage);
+//                     getControl().setData(STYLE, FormStyle.propertyMessage.style());
+               else
+                       CmsSwtUtils.style(getControl(), FormStyle.propertyText);
+//             getControl().setData(STYLE, FormStyle.propertyText.style());
+               super.stopEditing();
+       }
+
+       public QName getPropertyName() {
+               return propertyName;
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               if (isEditing()) {
+                       return createCustomEditableControl(box, style);
+               } else
+                       return createLabel(box, style);
+       }
+
+       protected Label createLabel(Composite box, String style) {
+               Label lbl = new Label(box, getStyle() | SWT.WRAP);
+               lbl.setLayoutData(CmsSwtUtils.fillWidth());
+               CmsSwtUtils.style(lbl, style);
+               CmsSwtUtils.markup(lbl);
+               if (mouseListener != null)
+                       lbl.addMouseListener(mouseListener);
+               return lbl;
+       }
+
+       private Control createCustomEditableControl(Composite box, String style) {
+               box.setLayoutData(CmsSwtUtils.fillWidth());
+               Composite dateComposite = new Composite(box, SWT.NONE);
+               GridLayout gl = EclipseUiUtils.noSpaceGridLayout(new GridLayout(2, false));
+               gl.horizontalSpacing = fieldBtnSpacing;
+               dateComposite.setLayout(gl);
+               dateTxt = new Text(dateComposite, SWT.BORDER);
+               CmsSwtUtils.style(dateTxt, style);
+               dateTxt.setLayoutData(new GridData(120, SWT.DEFAULT));
+               dateTxt.setToolTipText(
+                               "Enter a date with form \"" + FormUtils.DEFAULT_SHORT_DATE_FORMAT + "\" or use the calendar");
+               openCalBtn = new Button(dateComposite, SWT.FLAT);
+               CmsSwtUtils.style(openCalBtn, FormStyle.calendar.style() + FormStyle.BUTTON_SUFFIX);
+               GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
+               gd.heightHint = 17;
+               openCalBtn.setLayoutData(gd);
+               // openCalBtn.setImage(PeopleRapImages.CALENDAR_BTN);
+
+               openCalBtn.addSelectionListener(new SelectionAdapter() {
+                       private static final long serialVersionUID = 1L;
+
+                       public void widgetSelected(SelectionEvent event) {
+                               CalendarPopup popup = new CalendarPopup(dateTxt);
+                               popup.open();
+                       }
+               });
+
+               // dateTxt.addFocusListener(new FocusListener() {
+               // private static final long serialVersionUID = 1L;
+               //
+               // @Override
+               // public void focusLost(FocusEvent event) {
+               // String newVal = dateTxt.getText();
+               // // Enable reset of the field
+               // if (FormUtils.notNull(newVal))
+               // calendar = null;
+               // else {
+               // try {
+               // Calendar newCal = parseDate(newVal);
+               // // DateText.this.setText(newCal);
+               // calendar = newCal;
+               // } catch (ParseException pe) {
+               // // Silent. Manage error popup?
+               // if (calendar != null)
+               // EditablePropertyDate.this.setText(calendar);
+               // }
+               // }
+               // }
+               //
+               // @Override
+               // public void focusGained(FocusEvent event) {
+               // }
+               // });
+               return dateTxt;
+       }
+
+       protected void clear(boolean deep) {
+               Control child = getControl();
+               if (deep || child instanceof Label)
+                       super.clear(deep);
+               else {
+                       child.getParent().dispose();
+               }
+       }
+
+//     /** Enable setting a custom tooltip on the underlying text */
+//     @Deprecated
+//     public void setToolTipText(String toolTipText) {
+//             dateTxt.setToolTipText(toolTipText);
+//     }
+//
+//     @Deprecated
+//     /** Enable setting a custom message on the underlying text */
+//     public void setMessage(String message) {
+//             dateTxt.setMessage(message);
+//     }
+//
+//     @Deprecated
+//     public void setText(Calendar cal) {
+//             String newValueStr = "";
+//             if (cal != null)
+//                     newValueStr = dateFormat.format(cal.getTime());
+//             if (!newValueStr.equals(dateTxt.getText()))
+//                     dateTxt.setText(newValueStr);
+//     }
+
+       // UTILITIES TO MANAGE THE CALENDAR POPUP
+       // TODO manage the popup shell in a cleaner way
+       private class CalendarPopup extends Shell {
+               private static final long serialVersionUID = 1L;
+               private DateTime dateTimeCtl;
+
+               public CalendarPopup(Control source) {
+                       super(source.getDisplay(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+                       populate();
+                       // Add border and shadow style
+                       CmsSwtUtils.markup(CalendarPopup.this);
+                       CmsSwtUtils.style(CalendarPopup.this, FormStyle.popupCalendar.style());
+                       pack();
+                       layout();
+                       setLocation(source.toDisplay((source.getLocation().x - 2), (source.getSize().y) + 3));
+
+                       addShellListener(new ShellAdapter() {
+                               private static final long serialVersionUID = 5178980294808435833L;
+
+                               @Override
+                               public void shellDeactivated(ShellEvent e) {
+                                       close();
+                                       dispose();
+                               }
+                       });
+                       open();
+               }
+
+               private void setProperty() {
+                       // Direct set does not seems to work. investigate
+                       // cal.set(dateTimeCtl.getYear(), dateTimeCtl.getMonth(),
+                       // dateTimeCtl.getDay(), 12, 0);
+                       // TODO use modern time API
+                       Calendar cal = new GregorianCalendar();
+                       cal.set(Calendar.YEAR, dateTimeCtl.getYear());
+                       cal.set(Calendar.MONTH, dateTimeCtl.getMonth());
+                       cal.set(Calendar.DAY_OF_MONTH, dateTimeCtl.getDay());
+                       String dateStr = dateFormat.format(cal.toInstant());
+                       dateTxt.setText(dateStr);
+               }
+
+               protected void populate() {
+                       setLayout(EclipseUiUtils.noSpaceGridLayout());
+
+                       dateTimeCtl = new DateTime(this, SWT.CALENDAR);
+                       dateTimeCtl.setLayoutData(EclipseUiUtils.fillAll());
+
+                       TemporalAccessor calendar = FormUtils.parseDate(dateFormat, dateTxt.getText());
+
+                       if (calendar != null)
+                               dateTimeCtl.setDate(calendar.get(ChronoField.YEAR), calendar.get(ChronoField.MONTH_OF_YEAR),
+                                               calendar.get(ChronoField.DAY_OF_MONTH));
+
+                       dateTimeCtl.addSelectionListener(new SelectionAdapter() {
+                               private static final long serialVersionUID = -8414377364434281112L;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       setProperty();
+                               }
+                       });
+
+                       dateTimeCtl.addMouseListener(new MouseListener() {
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               public void mouseUp(MouseEvent e) {
+                               }
+
+                               @Override
+                               public void mouseDown(MouseEvent e) {
+                               }
+
+                               @Override
+                               public void mouseDoubleClick(MouseEvent e) {
+                                       setProperty();
+                                       close();
+                                       dispose();
+                               }
+                       });
+               }
+       }
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditablePropertyString.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/EditablePropertyString.java
new file mode 100644 (file)
index 0000000..7820bfe
--- /dev/null
@@ -0,0 +1,87 @@
+package org.argeo.app.swt.forms;
+
+import static org.argeo.app.swt.forms.FormStyle.propertyMessage;
+import static org.argeo.app.swt.forms.FormStyle.propertyText;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.widgets.EditableText;
+import org.argeo.cms.ux.acr.ContentPart;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** Editable String in a CMS context */
+public class EditablePropertyString extends EditableText implements SwtEditablePart, ContentPart {
+       private static final long serialVersionUID = 5055000749992803591L;
+
+       private QName propertyName;
+       private String message;
+
+       // encode the '&' character in rap
+       private final static String AMPERSAND = "&#38;";
+       private final static String AMPERSAND_REGEX = "&(?![#a-zA-Z0-9]+;)";
+
+       public EditablePropertyString(Composite parent, int style, Content node, QName propertyName, String message) {
+               super(parent, style);
+               // setUseTextAsLabel(true);
+               this.propertyName = propertyName;
+               this.message = message;
+               setData(node);
+
+               if (node.containsKey(propertyName)) {
+                       this.setStyle(propertyText.style());
+                       this.setText(node.attr(propertyName));
+               } else {
+                       this.setStyle(propertyMessage.style());
+                       this.setText(message + "  ");
+               }
+       }
+
+       public void setText(String text) {
+               Control child = getControl();
+               if (child instanceof Label) {
+                       Label lbl = (Label) child;
+                       if (EclipseUiUtils.isEmpty(text))
+                               lbl.setText(message + "  ");
+                       else
+                               // TODO enhance this
+                               lbl.setText(text.replaceAll(AMPERSAND_REGEX, AMPERSAND));
+               } else if (child instanceof Text) {
+                       Text txt = (Text) child;
+                       if (EclipseUiUtils.isEmpty(text)) {
+                               txt.setText("");
+                               txt.setMessage(message + " ");
+                       } else
+                               txt.setText(text.replaceAll("<br/>", "\n"));
+               }
+       }
+
+       public synchronized void startEditing() {
+               CmsSwtUtils.style(getControl(), FormStyle.propertyText);
+               super.startEditing();
+       }
+
+       public synchronized void stopEditing() {
+               if (EclipseUiUtils.isEmpty(((Text) getControl()).getText()))
+                       CmsSwtUtils.style(getControl(), FormStyle.propertyMessage);
+               else
+                       CmsSwtUtils.style(getControl(), FormStyle.propertyText);
+               super.stopEditing();
+       }
+
+       public QName getPropertyName() {
+               return propertyName;
+       }
+
+       @Override
+       public Content getContent() {
+               return (Content) getData();
+       }
+
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormConstants.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormConstants.java
new file mode 100644 (file)
index 0000000..1d45f46
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.app.swt.forms;
+
+/** Constants used in the various CMS Forms */
+public interface FormConstants {
+       // DATAKEYS
+       public final static String LINKED_VALUE = "LinkedValue";
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormPageViewer.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormPageViewer.java
new file mode 100644 (file)
index 0000000..becbf15
--- /dev/null
@@ -0,0 +1,566 @@
+package org.argeo.app.swt.forms;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAccessor;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.Cms2DSize;
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.api.cms.ux.CmsImageManager;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.acr.AbstractPageViewer;
+import org.argeo.cms.swt.acr.Img;
+import org.argeo.cms.swt.acr.SwtSection;
+import org.argeo.cms.swt.acr.SwtSectionPart;
+import org.argeo.cms.swt.widgets.StyledControl;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.rap.fileupload.FileDetails;
+import org.eclipse.rap.fileupload.FileUploadEvent;
+import org.eclipse.rap.fileupload.FileUploadHandler;
+import org.eclipse.rap.fileupload.FileUploadListener;
+import org.eclipse.rap.fileupload.FileUploadReceiver;
+import org.eclipse.rap.rwt.service.ServerPushSession;
+import org.eclipse.rap.rwt.widgets.FileUpload;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** Manage life cycle of a form page that is linked to a given node */
+public class FormPageViewer extends AbstractPageViewer {
+       private final static CmsLog log = CmsLog.getLog(FormPageViewer.class);
+
+       private final SwtSection mainSection;
+
+       // TODO manage within the CSS
+       private Integer labelColWidth = null;
+       private int rowLayoutHSpacing = 8;
+
+       // Context cached in the viewer
+       // The reference to translate from text to calendar and reverse
+       private DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(FormUtils.DEFAULT_SHORT_DATE_FORMAT);
+       // new SimpleDateFormat(FormUtils.DEFAULT_SHORT_DATE_FORMAT);
+       private CmsImageManager<Control, Content> imageManager;
+       private FileUploadListener fileUploadListener;
+
+       public FormPageViewer(SwtSection mainSection, int style, CmsEditable cmsEditable) {
+               super(mainSection, style, cmsEditable);
+               this.mainSection = mainSection;
+
+               if (getCmsEditable().canEdit()) {
+                       fileUploadListener = new FUL();
+               }
+       }
+
+       @Override
+       protected void prepare(SwtEditablePart part, Object caretPosition) {
+               if (part instanceof Img) {
+                       // ((Img) part).setFileUploadListener(fileUploadListener);
+               }
+       }
+
+       /** To be overridden.Save the edited part. */
+       protected void save(SwtEditablePart part) {
+               Content node = null;
+               if (part instanceof EditableMultiStringProperty ept) {
+                       List<String> values = ept.getValues();
+                       node = ept.getContent();
+                       QName propName = ept.getPropertyName();
+                       if (values.isEmpty()) {
+                               if (node.containsKey(propName))
+                                       node.remove(propName);
+                       } else {
+                               node.put(propName, values);
+//                             node.setProperty(propName, values.toArray(new String[0]));
+                       }
+                       // => Viewer : Controller
+               } else if (part instanceof EditablePropertyString ept) {
+                       String txt = ((Text) ept.getControl()).getText();
+                       node = ept.getContent();
+                       QName propName = ept.getPropertyName();
+                       if (EclipseUiUtils.isEmpty(txt)) {
+                               node.remove(propName);
+                       } else {
+                               setPropertySilently(node, propName, txt);
+                               // node.setProperty(propName, txt);
+                       }
+                       // node.getSession().save();
+                       // => Viewer : Controller
+               } else if (part instanceof EditablePropertyDate) {
+                       EditablePropertyDate ept = (EditablePropertyDate) part;
+                       // FIXME deal with no value set
+                       TemporalAccessor cal = FormUtils.parseDate(dateFormat, ((Text) ept.getControl()).getText());
+                       node = ept.getContent();
+                       QName propName = ept.getPropertyName();
+                       if (cal == null) {
+                               node.remove(propName);
+                       } else {
+                               node.put(propName, cal);
+                       }
+                       // node.getSession().save();
+                       // => Viewer : Controller
+               }
+               // TODO: make this configurable, sometimes we do not want to save the
+               // current session at this stage
+//             if (node != null && node.getSession().hasPendingChanges()) {
+//                     JcrUtils.updateLastModified(node, true);
+//                     node.getSession().save();
+//             }
+       }
+
+       @Override
+       protected void updateContent(SwtEditablePart part) {
+               if (part instanceof EditableMultiStringProperty ept) {
+                       Content node = ept.getContent();
+                       QName propName = ept.getPropertyName();
+                       List<String> valStrings = new ArrayList<String>();
+                       if (node.containsKey(propName)) {
+                               for (String val : node.getMultiple(propName, String.class))
+                                       valStrings.add(val);
+                       }
+                       ept.setValues(valStrings);
+               } else if (part instanceof EditablePropertyString ept) {
+                       // || part instanceof EditableLink
+                       Content node = ept.getContent();
+                       QName propName = ept.getPropertyName();
+                       ept.setText(node.get(propName, String.class).orElse(""));
+               } else if (part instanceof EditablePropertyDate ept) {
+                       Content node = ept.getContent();
+                       QName propName = ept.getPropertyName();
+                       if (node.containsKey(propName))
+                               ept.setText(dateFormat.format(node.get(propName, Instant.class).get()));
+                       else
+                               ept.setText("");
+               } else if (part instanceof SwtSectionPart sectionPart) {
+                       Content partNode = sectionPart.getContent();
+                       // use control AFTER setting style, since it may have been reset
+                       if (part instanceof Img) {
+                               Img editableImage = (Img) part;
+                               imageManager().load(partNode, part.getControl(), editableImage.getPreferredImageSize(), null);
+                       }
+               }
+       }
+
+       // FILE UPLOAD LISTENER
+       protected class FUL implements FileUploadListener {
+
+               public FUL() {
+               }
+
+               public void uploadProgress(FileUploadEvent event) {
+                       // TODO Monitor upload progress
+               }
+
+               public void uploadFailed(FileUploadEvent event) {
+                       throw new IllegalStateException("Upload failed " + event, event.getException());
+               }
+
+               public void uploadFinished(FileUploadEvent event) {
+                       for (FileDetails file : event.getFileDetails()) {
+                               if (log.isDebugEnabled())
+                                       log.debug("Received: " + file.getFileName());
+                       }
+                       mainSection.getDisplay().syncExec(new Runnable() {
+                               @Override
+                               public void run() {
+                                       saveEdit();
+                               }
+                       });
+                       FileUploadHandler uploadHandler = (FileUploadHandler) event.getSource();
+                       uploadHandler.dispose();
+               }
+       }
+
+       // FOCUS OUT LISTENER
+       protected FocusListener createFocusListener() {
+               return new FocusOutListener();
+       }
+
+       private class FocusOutListener implements FocusListener {
+               private static final long serialVersionUID = -6069205786732354186L;
+
+               @Override
+               public void focusLost(FocusEvent event) {
+                       saveEdit();
+               }
+
+               @Override
+               public void focusGained(FocusEvent event) {
+                       // does nothing;
+               }
+       }
+
+       // MOUSE LISTENER
+       @Override
+       protected MouseListener createMouseListener() {
+               return new ML();
+       }
+
+       private class ML extends MouseAdapter {
+               private static final long serialVersionUID = 8526890859876770905L;
+
+               @Override
+               public void mouseDoubleClick(MouseEvent e) {
+                       if (e.button == 1) {
+                               Control source = (Control) e.getSource();
+                               if (getCmsEditable().canEdit()) {
+                                       if (getCmsEditable().isEditing() && !(getEdited() instanceof Img)) {
+                                               if (source == mainSection)
+                                                       return;
+                                               SwtEditablePart part = findDataParent(source);
+                                               upload(part);
+                                       } else {
+                                               getCmsEditable().startEditing();
+                                       }
+                               }
+                       }
+               }
+
+               @Override
+               public void mouseDown(MouseEvent e) {
+                       if (getCmsEditable().isEditing()) {
+                               if (e.button == 1) {
+                                       Control source = (Control) e.getSource();
+                                       SwtEditablePart composite = findDataParent(source);
+                                       Point point = new Point(e.x, e.y);
+                                       if (!(composite instanceof Img))
+                                               edit(composite, source.toDisplay(point));
+                               } else if (e.button == 3) {
+                                       // EditablePart composite = findDataParent((Control) e
+                                       // .getSource());
+                                       // if (styledTools != null)
+                                       // styledTools.show(composite, new Point(e.x, e.y));
+                               }
+                       }
+               }
+
+               protected synchronized void upload(SwtEditablePart part) {
+                       if (part instanceof SwtSectionPart) {
+                               if (part instanceof Img) {
+                                       if (getEdited() == part)
+                                               return;
+                                       edit(part, null);
+                                       layout(part.getControl());
+                               }
+                       }
+               }
+       }
+
+       @Override
+       public Control getControl() {
+               return mainSection;
+       }
+
+       protected CmsImageManager<Control, Content> imageManager() {
+               if (imageManager == null)
+                       imageManager = CmsSwtUtils.getCmsView(mainSection).getImageManager();
+               return imageManager;
+       }
+
+       // LOCAL UI HELPERS
+       protected SwtSection createSectionIfNeeded(Composite body, Content node) {
+               SwtSection section = null;
+               if (node != null) {
+                       section = new SwtSection(body, SWT.NO_FOCUS, node);
+                       section.setLayoutData(CmsSwtUtils.fillWidth());
+                       section.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               }
+               return section;
+       }
+
+       protected void createSimpleLT(Composite bodyRow, Content node, QName propName, String label, String msg) {
+               if (getCmsEditable().canEdit() || node.containsKey(propName)) {
+                       createPropertyLbl(bodyRow, label);
+                       EditablePropertyString eps = new EditablePropertyString(bodyRow, SWT.WRAP | SWT.LEFT, node, propName, msg);
+                       eps.setMouseListener(getMouseListener());
+                       eps.setFocusListener(getFocusListener());
+                       eps.setLayoutData(CmsSwtUtils.fillWidth());
+               }
+       }
+
+       protected void createMultiStringLT(Composite bodyRow, Content node, QName propName, String label, String msg) {
+               boolean canEdit = getCmsEditable().canEdit();
+               if (canEdit || node.containsKey(propName)) {
+                       createPropertyLbl(bodyRow, label);
+
+                       List<String> valueStrings = new ArrayList<String>();
+
+                       if (node.containsKey(propName)) {
+                               for (String value : node.getMultiple(propName, String.class))
+                                       valueStrings.add(value);
+                       }
+
+                       // TODO use a drop down to display possible values to the end user
+                       EditableMultiStringProperty emsp = new EditableMultiStringProperty(bodyRow, SWT.SINGLE | SWT.LEAD, node,
+                                       propName, valueStrings, new String[] { "Implement this" }, msg,
+                                       canEdit ? getRemoveValueSelListener() : null);
+                       addListeners(emsp);
+                       // emsp.setMouseListener(getMouseListener());
+                       emsp.setStyle(FormStyle.propertyMessage.style());
+                       emsp.setLayoutData(CmsSwtUtils.fillWidth());
+               }
+       }
+
+       protected Label createPropertyLbl(Composite parent, String value) {
+               return createPropertyLbl(parent, value, SWT.NONE);
+       }
+
+       protected Label createPropertyLbl(Composite parent, String value, int vAlign) {
+               // boolean isSmall = CmsView.getCmsView(parent).getUxContext().isSmall();
+               Label label = new Label(parent, SWT.LEAD | SWT.WRAP);
+               label.setText(value + " ");
+               CmsSwtUtils.style(label, FormStyle.propertyLabel.style());
+               GridData gd = new GridData(SWT.LEAD, vAlign, false, false);
+               if (labelColWidth != null)
+                       gd.widthHint = labelColWidth;
+               label.setLayoutData(gd);
+               return label;
+       }
+
+       protected Label newStyledLabel(Composite parent, String style, String value) {
+               Label label = new Label(parent, SWT.NONE);
+               label.setText(value);
+               CmsSwtUtils.style(label, style);
+               return label;
+       }
+
+       protected Composite createRowLayoutComposite(Composite parent) {
+               Composite bodyRow = new Composite(parent, SWT.NO_FOCUS);
+               bodyRow.setLayoutData(CmsSwtUtils.fillWidth());
+               RowLayout rl = new RowLayout(SWT.WRAP);
+               rl.type = SWT.HORIZONTAL;
+               rl.spacing = rowLayoutHSpacing;
+               rl.marginHeight = rl.marginWidth = 0;
+               rl.marginTop = rl.marginBottom = rl.marginLeft = rl.marginRight = 0;
+               bodyRow.setLayout(rl);
+               return bodyRow;
+       }
+
+       protected Composite createAddImgComposite(SwtSection section, Composite parent, Content parentNode) {
+
+               Composite body = new Composite(parent, SWT.NO_FOCUS);
+               body.setLayout(new GridLayout());
+
+               FormFileUploadReceiver receiver = new FormFileUploadReceiver(section, parentNode, null);
+               final FileUploadHandler currentUploadHandler = new FileUploadHandler(receiver);
+               if (fileUploadListener != null)
+                       currentUploadHandler.addUploadListener(fileUploadListener);
+
+               // Button creation
+               final FileUpload fileUpload = new FileUpload(body, SWT.BORDER);
+               fileUpload.setText("Import an image");
+               fileUpload.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+               fileUpload.addSelectionListener(new SelectionAdapter() {
+                       private static final long serialVersionUID = 4869523412991968759L;
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               ServerPushSession pushSession = new ServerPushSession();
+                               pushSession.start();
+                               String uploadURL = currentUploadHandler.getUploadUrl();
+                               fileUpload.submit(uploadURL);
+                       }
+               });
+
+               return body;
+       }
+
+       protected class FormFileUploadReceiver extends FileUploadReceiver {
+
+               private Content context;
+               private SwtSection section;
+               private String name;
+
+               public FormFileUploadReceiver(SwtSection section, Content context, String name) {
+                       this.context = context;
+                       this.section = section;
+                       this.name = name;
+               }
+
+               @Override
+               public void receive(InputStream stream, FileDetails details) throws IOException {
+
+                       if (name == null)
+                               name = details.getFileName();
+
+                       // TODO clean image name more carefully
+                       String cleanedName = name.replaceAll("[^a-zA-Z0-9-.]", "");
+                       // We add a unique prefix to workaround the cache issue: when
+                       // deleting and re-adding a new image with same name, the end user
+                       // browser will use the cache and the image will remain unchanged
+                       // for a while
+                       cleanedName = System.currentTimeMillis() % 100000 + "_" + cleanedName;
+
+                       imageManager().uploadImage(context, context, cleanedName, stream, details.getContentType());
+                       // TODO clean refresh strategy
+                       section.getDisplay().asyncExec(new Runnable() {
+                               @Override
+                               public void run() {
+                                       FormPageViewer.this.refresh(section);
+                                       section.layout();
+                                       section.getParent().layout();
+                               }
+                       });
+               }
+       }
+
+       protected void addListeners(StyledControl control) {
+               control.setMouseListener(getMouseListener());
+               control.setFocusListener(getFocusListener());
+       }
+
+       protected Img createImgComposite(Composite parent, Content node, Point preferredSize) {
+               Img img = new Img(parent, SWT.NONE, node, new Cms2DSize(preferredSize.x, preferredSize.y)) {
+                       private static final long serialVersionUID = 1297900641952417540L;
+
+                       @Override
+                       protected void setContainerLayoutData(Composite composite) {
+                               composite.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
+                       }
+
+                       @Override
+                       protected void setControlLayoutData(Control control) {
+                               control.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
+                       }
+               };
+               img.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
+               updateContent(img);
+               addListeners(img);
+               return img;
+       }
+
+       protected Composite addDeleteAbility(final SwtSection section, Content sessionNode, int topWeight,
+                       int rightWeight) {
+               Composite comp = new Composite(section, SWT.NONE);
+               comp.setLayoutData(CmsSwtUtils.fillAll());
+               comp.setLayout(new FormLayout());
+
+               // The body to be populated
+               Composite body = new Composite(comp, SWT.NO_FOCUS);
+               body.setLayoutData(EclipseUiUtils.fillFormData());
+
+               if (getCmsEditable().canEdit()) {
+                       // the delete button
+                       Button deleteBtn = new Button(comp, SWT.FLAT);
+                       CmsSwtUtils.style(deleteBtn, FormStyle.deleteOverlay.style());
+                       FormData formData = new FormData();
+                       formData.right = new FormAttachment(rightWeight, 0);
+                       formData.top = new FormAttachment(topWeight, 0);
+                       deleteBtn.setLayoutData(formData);
+                       deleteBtn.moveAbove(body);
+
+                       deleteBtn.addSelectionListener(new SelectionAdapter() {
+                               private static final long serialVersionUID = 4304223543657238462L;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       super.widgetSelected(e);
+//                                     if (MessageDialog.openConfirm(section.getShell(), "Confirm deletion",
+//                                                     "Are you really you want to remove this?")) {
+//                                             Session session;
+//                                             try {
+//                                                     session = sessionNode.getSession();
+//                                                     SwtSection parSection = section.getParentSection();
+//                                                     sessionNode.remove();
+//                                                     session.save();
+//                                                     refresh(parSection);
+//                                                     layout(parSection);
+//                                             } catch (RepositoryException re) {
+//                                                     throw new JcrException("Unable to delete " + sessionNode, re);
+//                                             }
+//
+//                                     }
+
+                               }
+                       });
+               }
+               return body;
+       }
+
+//     // LOCAL HELPERS FOR NODE MANAGEMENT
+//     private Node getOrCreateNode(Node parent, String nodeName, String nodeType) throws RepositoryException {
+//             Node node = null;
+//             if (getCmsEditable().canEdit() && !parent.hasNode(nodeName)) {
+//                     node = JcrUtils.mkdirs(parent, nodeName, nodeType);
+//                     parent.getSession().save();
+//             }
+//
+//             if (getCmsEditable().canEdit() || parent.hasNode(nodeName))
+//                     node = parent.getNode(nodeName);
+//
+//             return node;
+//     }
+
+       private SelectionListener getRemoveValueSelListener() {
+               return new SelectionAdapter() {
+                       private static final long serialVersionUID = 9022259089907445195L;
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               Object source = e.getSource();
+                               if (source instanceof Button) {
+                                       Button btn = (Button) source;
+                                       Object obj = btn.getData(FormConstants.LINKED_VALUE);
+                                       SwtEditablePart ep = findDataParent(btn);
+                                       if (ep != null && ep instanceof EditableMultiStringProperty) {
+                                               EditableMultiStringProperty emsp = (EditableMultiStringProperty) ep;
+                                               List<String> values = emsp.getValues();
+                                               if (values.contains(obj)) {
+                                                       values.remove(values.indexOf(obj));
+                                                       emsp.setValues(values);
+                                                       save(emsp);
+                                                       // TODO workaround to force refresh
+                                                       edit(emsp, 0);
+                                                       cancelEdit();
+                                                       layout(emsp);
+                                               }
+                                       }
+                               }
+                       }
+               };
+       }
+
+       protected void setPropertySilently(Content node, QName propName, String value) {
+               // TODO Clean this:
+               // Format strings to replace \n
+               value = value.replaceAll("\n", "<br/>");
+               // Do not make the update if validation fails
+//                     try {
+//                             MarkupValidatorCopy.getInstance().validate(value);
+//                     } catch (Exception e) {
+//                             log.warn("Cannot set [" + value + "] on prop " + propName + "of " + node
+//                                             + ", String cannot be validated - " + e.getMessage());
+//                             return;
+//                     }
+               // TODO check if the newly created property is of the correct type,
+               // otherwise the property will be silently created with a STRING
+               // property type.
+               node.put(propName, value);
+       }
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormStyle.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormStyle.java
new file mode 100644 (file)
index 0000000..6bc3df8
--- /dev/null
@@ -0,0 +1,29 @@
+package org.argeo.app.swt.forms;
+
+import org.argeo.api.cms.ux.CmsStyle;
+
+/** Syles used */
+public enum FormStyle implements CmsStyle {
+       // Main
+       form, title,
+       // main part
+       header, headerBtn, headerCombo, section, sectionHeader,
+       // Property fields
+       propertyLabel, propertyText, propertyMessage, errorMessage,
+       // Date
+       popupCalendar,
+       // Buttons
+       starred, unstarred, starOverlay, editOverlay, deleteOverlay, updateOverlay, deleteOverlaySmall, calendar, delete,
+       // Contacts
+       email, address, phone, website,
+       // Social Media
+       facebook, twitter, linkedIn, instagram;
+
+       @Override
+       public String getClassPrefix() {
+               return "argeo-form";
+       }
+
+       // TODO clean button style management
+       public final static String BUTTON_SUFFIX = "_btn";
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormUtils.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/forms/FormUtils.java
new file mode 100644 (file)
index 0000000..6ce8b54
--- /dev/null
@@ -0,0 +1,173 @@
+package org.argeo.app.swt.forms;
+
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.TemporalAccessor;
+
+import org.argeo.api.cms.CmsLog;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+
+/** Utilitary methods to ease implementation of CMS forms */
+public class FormUtils {
+       private final static CmsLog log = CmsLog.getLog(FormUtils.class);
+
+       public final static String DEFAULT_SHORT_DATE_FORMAT = "dd/MM/yyyy";
+
+       /** Best effort to convert a String to a calendar. Fails silently */
+       public static TemporalAccessor parseDate(DateTimeFormatter dateFormat, String calStr) {
+               if (EclipseUiUtils.notEmpty(calStr)) {
+                       try {
+                               return dateFormat.parse(calStr);
+//                             cal = new GregorianCalendar();
+//                             cal.setTime(date);
+                       } catch (DateTimeParseException pe) {
+                               // Silent
+                               log.warn("Unable to parse date: " + calStr + " - msg: " + pe.getMessage());
+                               throw pe;
+                       }
+               }
+               return null;
+       }
+
+//     /** Add a double click listener on tables that display a JCR node list */
+//     public static void addCanonicalDoubleClickListener(final TableViewer v) {
+//             v.addDoubleClickListener(new IDoubleClickListener() {
+//
+//                     @Override
+//                     public void doubleClick(DoubleClickEvent event) {
+//                             CmsView cmsView = CmsUiUtils.getCmsView();
+//                             Node node = (Node) ((IStructuredSelection) event.getSelection())
+//                                             .getFirstElement();
+//                             try {
+//                                     cmsView.navigateTo(node.getPath());
+//                             } catch (RepositoryException e) {
+//                                     throw new CmsException("Unable to get path for node "
+//                                                     + node + " before calling navigateTo(path)", e);
+//                             }
+//                     }
+//             });
+//     }
+
+       // MANAGE ERROR DECORATION
+
+//     public static ControlDecoration addDecoration(final Text text) {
+//             final ControlDecoration dynDecoration = new ControlDecoration(text,
+//                             SWT.LEFT);
+//             Image icon = getDecorationImage(FieldDecorationRegistry.DEC_ERROR);
+//             dynDecoration.setImage(icon);
+//             dynDecoration.setMarginWidth(3);
+//             dynDecoration.hide();
+//             return dynDecoration;
+//     }
+//
+//     public static void refreshDecoration(Text text, ControlDecoration deco,
+//                     boolean isValid, boolean clean) {
+//             if (isValid || clean) {
+//                     text.setBackground(null);
+//                     deco.hide();
+//             } else {
+//                     text.setBackground(new Color(text.getDisplay(), 250, 200, 150));
+//                     deco.show();
+//             }
+//     }
+//
+//     public static Image getDecorationImage(String image) {
+//             FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault();
+//             return registry.getFieldDecoration(image).getImage();
+//     }
+//
+//     public static void addCompulsoryDecoration(Label label) {
+//             final ControlDecoration dynDecoration = new ControlDecoration(label,
+//                             SWT.RIGHT | SWT.TOP);
+//             Image icon = getDecorationImage(FieldDecorationRegistry.DEC_REQUIRED);
+//             dynDecoration.setImage(icon);
+//             dynDecoration.setMarginWidth(3);
+//     }
+
+       // TODO the read only generation of read only links for various contact type
+       // should be factorised in the cms Utils.
+       /**
+        * Creates the read-only HTML snippet to display in a label with styling enabled
+        * in order to provide a click-able phone number
+        */
+       public static String getPhoneLink(String value) {
+               return getPhoneLink(value, value);
+       }
+
+       /**
+        * Creates the read-only HTML snippet to display in a label with styling enabled
+        * in order to provide a click-able phone number
+        * 
+        * @param value
+        * @param label a potentially distinct label
+        * @return the link
+        */
+       public static String getPhoneLink(String value, String label) {
+               StringBuilder builder = new StringBuilder();
+               builder.append("<a href=\"tel:");
+               builder.append(value).append("\" target=\"_blank\" >").append(label).append("</a>");
+               return builder.toString();
+       }
+
+       /**
+        * Creates the read-only HTML snippet to display in a label with styling enabled
+        * in order to provide a click-able mail
+        */
+       public static String getMailLink(String value) {
+               return getMailLink(value, value);
+       }
+
+       /**
+        * Creates the read-only HTML snippet to display in a label with styling enabled
+        * in order to provide a click-able mail
+        * 
+        * @param value
+        * @param label a potentially distinct label
+        * @return the link
+        */
+       public static String getMailLink(String value, String label) {
+               StringBuilder builder = new StringBuilder();
+               value = replaceAmpersand(value);
+               builder.append("<a href=\"mailto:");
+               builder.append(value).append("\" >").append(label).append("</a>");
+               return builder.toString();
+       }
+
+       /**
+        * Creates the read-only HTML snippet to display in a label with styling enabled
+        * in order to provide a click-able link
+        */
+       public static String getUrlLink(String value) {
+               return getUrlLink(value, value);
+       }
+
+       /**
+        * Creates the read-only HTML snippet to display in a label with styling enabled
+        * in order to provide a click-able link
+        */
+       public static String getUrlLink(String value, String label) {
+               StringBuilder builder = new StringBuilder();
+               value = replaceAmpersand(value);
+               label = replaceAmpersand(label);
+               if (!(value.startsWith("http://") || value.startsWith("https://")))
+                       value = "http://" + value;
+               builder.append("<a href=\"");
+               builder.append(value + "\" target=\"_blank\" >" + label + "</a>");
+               return builder.toString();
+       }
+
+       private static String AMPERSAND = "&#38;";
+
+       /**
+        * Cleans a String by replacing any '&#38;' by its HTML encoding '&#38;#38;' to
+        * avoid <code>SAXParseException</code> while rendering HTML with RWT
+        */
+       public static String replaceAmpersand(String value) {
+               value = value.replaceAll("&(?![#a-zA-Z0-9]+;)", AMPERSAND);
+               return value;
+       }
+
+       // Prevents instantiation
+       private FormUtils() {
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/js/SwtBrowserJsPart.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/js/SwtBrowserJsPart.java
new file mode 100644 (file)
index 0000000..6782f5d
--- /dev/null
@@ -0,0 +1,194 @@
+package org.argeo.app.swt.js;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
+import java.util.function.Function;
+
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ux.js.JsClient;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.BrowserFunction;
+import org.eclipse.swt.browser.ProgressEvent;
+import org.eclipse.swt.browser.ProgressListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A part using a {@link Browser} and remote JavaScript components on the client
+ * side.
+ */
+public class SwtBrowserJsPart implements JsClient {
+       private final static CmsLog log = CmsLog.getLog(SwtBrowserJsPart.class);
+
+       private final static String GLOBAL_THIS_ = "globalThis.";
+
+       private final Browser browser;
+       private final CompletableFuture<Boolean> readyStage = new CompletableFuture<>();
+
+       /**
+        * Tasks that were requested before the context was ready. Typically
+        * configuration methods on the part while the user interfaces is being build.
+        */
+       private List<PreReadyToDo> preReadyToDos = new ArrayList<>();
+
+       public SwtBrowserJsPart(Composite parent, int style, String url) {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               this.browser = new Browser(parent, 0);
+               if (parent.getLayout() instanceof GridLayout)
+                       browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               // TODO other layouts
+
+               URI u = cmsView.toBackendUri(url);
+               browser.setUrl(u.toString());
+               browser.addProgressListener(new ProgressListener() {
+                       static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void completed(ProgressEvent event) {
+                               try {
+                                       init();
+                                       loadExtensions();
+                                       // execute todos in order
+                                       for (PreReadyToDo toDo : preReadyToDos) {
+                                               toDo.run();
+                                       }
+                                       preReadyToDos.clear();
+                                       readyStage.complete(true);
+                               } catch (Exception e) {
+                                       log.error("Cannot initialise " + url + " in browser", e);
+                                       readyStage.complete(false);
+                               }
+                       }
+
+                       @Override
+                       public void changed(ProgressEvent event) {
+                       }
+               });
+       }
+
+       /*
+        * LIFECYCLE
+        */
+
+       /**
+        * Called when the page has been loaded, typically in order to initialise
+        * JavaScript objects. One MUST use {@link #doExecute(String, Object...)} in
+        * order to do so, since the context is not yet considered ready and calls to
+        * {@link #evaluate(String, Object...)} will block.
+        */
+       protected void init() {
+       }
+
+       /**
+        * To be overridden with calls to {@link #loadExtension(String)}.
+        */
+       protected void loadExtensions() {
+
+       }
+
+       protected void loadExtension(String url) {
+               URI u = CmsSwtUtils.getCmsView(getControl()).toBackendUri(url);
+               browser.evaluate(String.format(Locale.ROOT, "import('%s')", u.toString()));
+       }
+
+       public CompletionStage<Boolean> getReadyStage() {
+               return readyStage.minimalCompletionStage();
+       }
+
+       /*
+        * JAVASCRIPT ACCESS
+        */
+
+       @Override
+       public Object evaluate(String js, Object... args) {
+               assert browser.getDisplay().equals(Display.findDisplay(Thread.currentThread())) : "Not the proper UI thread.";
+               if (!readyStage.isDone())
+                       throw new IllegalStateException("Methods returning a result can only be called after UI initialisation.");
+               if (browser.isDisposed())
+                       return null;
+               Object result = browser.evaluate(String.format(Locale.ROOT, js, args));
+               return result;
+       }
+
+       @Override
+       public void execute(String js, Object... args) {
+               String jsToExecute = String.format(Locale.ROOT, js, args);
+               if (readyStage.isDone()) {
+                       if (browser.isDisposed())
+                               return;
+                       boolean success = browser.execute(jsToExecute);
+                       if (!success)
+                               throw new RuntimeException("JavaScript execution failed.");
+               } else {
+                       PreReadyToDo toDo = new PreReadyToDo(jsToExecute);
+                       preReadyToDos.add(toDo);
+               }
+       }
+
+       @Override
+       public String createJsFunction(String name, Function<Object[], Object> toDo) {
+               // browser functions must be directly on window (RAP specific)
+               new BrowserFunction(browser, name) {
+
+                       @Override
+                       public Object function(Object[] arguments) {
+                               Object result = toDo.apply(arguments);
+                               return result;
+                       }
+
+               };
+               return "window." + name;
+       }
+
+       /**
+        * Directly executes, even if {@link #getReadyStage()} is not completed. Except
+        * in initialisation, {@link #evaluate(String, Object...)} should be used
+        * instead.
+        */
+       protected void doExecute(String js, Object... args) {
+               if (browser.isDisposed())
+                       return;
+               browser.execute(String.format(Locale.ROOT, js, args));
+       }
+
+       @Override
+       public String getJsVarName(String name) {
+               return GLOBAL_THIS_ + name;
+       }
+
+       class PreReadyToDo implements Runnable {
+               private String js;
+
+               public PreReadyToDo(String js) {
+                       this.js = js;
+               }
+
+               @Override
+               public void run() {
+                       if (browser.isDisposed())
+                               return;
+                       boolean success = browser.execute(js);
+                       if (!success && log.isTraceEnabled())
+                               log.error("Pre-ready JavaScript failed: " + js);
+               }
+       }
+
+       /*
+        * ACCESSORS
+        */
+
+       public Control getControl() {
+               return browser;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/osgi/BundleSvgTheme.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/osgi/BundleSvgTheme.java
new file mode 100644 (file)
index 0000000..0c674ed
--- /dev/null
@@ -0,0 +1,132 @@
+package org.argeo.app.swt.osgi;
+
+import static java.lang.System.Logger.Level.TRACE;
+
+import java.awt.Color;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.System.Logger;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.batik.transcoder.TranscoderException;
+import org.apache.batik.transcoder.TranscoderInput;
+import org.apache.batik.transcoder.TranscoderOutput;
+import org.apache.batik.transcoder.image.ImageTranscoder;
+import org.apache.batik.transcoder.image.PNGTranscoder;
+import org.argeo.cms.swt.osgi.BundleCmsSwtTheme;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.framework.BundleContext;
+
+/** Theme which can dynamically create icons from SVG data. */
+public class BundleSvgTheme extends BundleCmsSwtTheme {
+       private final static Logger logger = System.getLogger(BundleSvgTheme.class.getName());
+
+       private Map<String, Map<Integer, ImageData>> imageDataCache = Collections.synchronizedMap(new HashMap<>());
+
+       private Map<Integer, ImageTranscoder> transcoders = Collections.synchronizedMap(new HashMap<>());
+
+       private final static String IMAGE_CACHE_KEY = BundleSvgTheme.class.getName() + ".imageCache";
+
+       @Override
+       public Image getIcon(String name, Integer preferredSize) {
+               String path = "icons/types/svg/" + name + ".svg";
+               return createImageFromSvg(path, preferredSize);
+       }
+
+       @SuppressWarnings("unchecked")
+       protected Image createImageFromSvg(String path, Integer preferredSize) {
+               Display display = Display.getCurrent();
+               Objects.requireNonNull(display, "Not a user interface thread");
+
+               Map<String, Map<Integer, Image>> imageCache = (Map<String, Map<Integer, Image>>) display
+                               .getData(IMAGE_CACHE_KEY);
+               if (imageCache == null)
+                       display.setData(IMAGE_CACHE_KEY, new HashMap<String, Map<Integer, Image>>());
+               imageCache = (Map<String, Map<Integer, Image>>) display.getData(IMAGE_CACHE_KEY);
+
+               Image image = null;
+               if (imageCache.containsKey(path)) {
+                       image = imageCache.get(path).get(preferredSize);
+               }
+               if (image != null)
+                       return image;
+               ImageData imageData = loadFromSvg(path, preferredSize);
+               image = new Image(display, imageData);
+               if (!imageCache.containsKey(path))
+                       imageCache.put(path, Collections.synchronizedMap(new HashMap<>()));
+               imageCache.get(path).put(preferredSize, image);
+               return image;
+       }
+
+       protected ImageData loadFromSvg(String path, int size) {
+               ImageData imageData = null;
+               if (imageDataCache.containsKey(path))
+                       imageData = imageDataCache.get(path).get(size);
+               if (imageData != null)
+                       return imageData;
+
+               ImageTranscoder transcoder = null;
+               synchronized (this) {
+                       transcoder = transcoders.get(size);
+                       if (transcoder == null) {
+                               transcoder = new PNGTranscoder();
+                               transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) size);
+                               transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) size);
+                               transcoder.addTranscodingHint(PNGTranscoder.KEY_BACKGROUND_COLOR, new Color(255, 255, 255, 0));
+                               transcoders.put(size, transcoder);
+                       }
+               }
+               try (InputStream in = getResourceAsStream(path); ByteArrayOutputStream out = new ByteArrayOutputStream();) {
+                       if (in == null)
+                               throw new IllegalArgumentException(path + " not found");
+                       TranscoderInput input = new TranscoderInput(in);
+                       TranscoderOutput output = new TranscoderOutput(out);
+                       transcoder.transcode(input, output);
+                       try (InputStream imageIn = new ByteArrayInputStream(out.toByteArray())) {
+                               imageData = new ImageData(imageIn);
+                       }
+                       logger.log(TRACE, () -> "Generated " + size + "x" + size + " PNG icon from " + path);
+               } catch (IOException | TranscoderException e) {
+                       throw new RuntimeException("Cannot transcode SVG " + path, e);
+               }
+
+               // cache it
+               if (!imageDataCache.containsKey(path))
+                       imageDataCache.put(path, Collections.synchronizedMap(new HashMap<>()));
+               imageDataCache.get(path).put(size, imageData);
+
+               return imageData;
+       }
+
+       @Override
+       public void init(BundleContext bundleContext, Map<String, String> properties) {
+               super.init(bundleContext, properties);
+
+               // preload all icons
+//             paths: for (String p : getImagesPaths()) {
+//                     if (!p.endsWith(".svg"))
+//                             continue paths;
+//                     createImageFromSvg(p, getDefaultIconSize());
+//             }
+       }
+
+//     @Override
+//     public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+//             Display display = Display.getDefault();
+//             if (display != null)
+//                     for (String path : imageCache.keySet()) {
+//                             for (Image image : imageCache.get(path).values()) {
+//                                     display.syncExec(() -> image.dispose());
+//                             }
+//                     }
+//             super.destroy(bundleContext, properties);
+//     }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/osgi/SvgToPng.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/osgi/SvgToPng.java
new file mode 100644 (file)
index 0000000..236dbc6
--- /dev/null
@@ -0,0 +1,64 @@
+package org.argeo.app.swt.osgi;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.batik.transcoder.TranscoderException;
+import org.apache.batik.transcoder.TranscoderInput;
+import org.apache.batik.transcoder.TranscoderOutput;
+import org.apache.batik.transcoder.image.ImageTranscoder;
+import org.apache.batik.transcoder.image.PNGTranscoder;
+
+public class SvgToPng {
+
+       public void convertSvgDir(Path sourceDir, Path targetDir, int width) {
+               System.out.println("##\n## " + width + "px - " + sourceDir + "\n##");
+               try {
+                       if (targetDir == null)
+                               targetDir = sourceDir.getParent().resolve(Integer.toString(width));
+                       Files.createDirectories(targetDir);
+
+                       PNGTranscoder transcoder = new PNGTranscoder();
+                       // transcoder.addTranscodingHint(ImageTranscoder.KEY_BACKGROUND_COLOR,
+                       // Color.WHITE);
+                       transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) width);
+                       transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) width);
+
+                       for (Path source : Files.newDirectoryStream(sourceDir, "*.svg")) {
+                               // FIXME extract base name
+                               String baseName = null; // = FilenameUtils.getBaseName(source.toString());
+                               Path target = targetDir.resolve(baseName + ".png");
+                               convertSvgFile(transcoder, source, target);
+                       }
+               } catch (IOException | TranscoderException e) {
+                       throw new IllegalStateException("Cannot convert from " + sourceDir + " to " + targetDir, e);
+               }
+
+       }
+
+       protected void convertSvgFile(ImageTranscoder transcoder, Path source, Path target)
+                       throws IOException, TranscoderException {
+               try (Reader reader = Files.newBufferedReader(source); OutputStream out = Files.newOutputStream(target);) {
+                       TranscoderInput input = new TranscoderInput(reader);
+//                     BufferedImage image = transcoder.createImage(32, 32);
+                       TranscoderOutput output = new TranscoderOutput(out);
+                       transcoder.transcode(input, output);
+                       System.out.println(source.getFileName() + " -> " + target);
+               }
+       }
+
+       public static void main(String[] args) throws Exception {
+
+               Path path = Paths.get(args[0]);
+
+               SvgToPng svgToPng = new SvgToPng();
+               svgToPng.convertSvgDir(path, null, 16);
+               svgToPng.convertSvgDir(path, null, 32);
+               svgToPng.convertSvgDir(path, null, 64);
+               svgToPng.convertSvgDir(path, null, 96);
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/space/SpaceEntryArea.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/space/SpaceEntryArea.java
new file mode 100644 (file)
index 0000000..fabab76
--- /dev/null
@@ -0,0 +1,59 @@
+package org.argeo.app.swt.space;
+
+import java.net.URI;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.widgets.SwtTreeView;
+import org.argeo.cms.ux.acr.ContentHierarchicalPart;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Entry area for managing the typologies. */
+public class SpaceEntryArea implements SwtUiProvider {
+       @Override
+       public Control createUiPart(Composite parent, Content content) {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+
+               parent.setLayout(new GridLayout());
+
+               ContentHierarchicalPart contentPart = new ContentHierarchicalPart() {
+
+                       @Override
+                       public List<Content> getChildren(Content parent) {
+                               if (parent != null)
+                                       return super.getChildren(parent);
+                               List<Content> res = ((ProvidedContent) content).getSession().search((bs) -> {
+                                       bs.from(URI.create("/sys")).where((f) -> f.isContentClass(EntityType.space));
+                               }).filter((c) -> noSpaceParent((ProvidedContent) c)).toList();
+                               return res;
+                       }
+
+               };
+               contentPart.addColumn((c) -> NamespaceUtils.toPrefixedName(c.getName()));
+//             contentPart.setInput(content);
+
+               SwtTreeView<Content> view = new SwtTreeView<>(parent, 0, contentPart);
+               view.setLayoutData(CmsSwtUtils.fillAll());
+
+               contentPart.setInput(null);
+               return view;
+
+       }
+
+       private static boolean noSpaceParent(ProvidedContent content) {
+               if (content.isRoot() || !content.isParentAccessible())// end condition
+                       return true;
+               ProvidedContent parent = (ProvidedContent) content.getParent();
+               if (parent.hasContentClass(EntityType.space))
+                       return false;
+               return noSpaceParent(parent);
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/AbstractTermsPart.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/AbstractTermsPart.java
new file mode 100644 (file)
index 0000000..bab73db
--- /dev/null
@@ -0,0 +1,179 @@
+package org.argeo.app.swt.terms;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.api.app.Typology;
+import org.argeo.api.cms.ux.CmsIcon;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.widgets.ContextOverlay;
+import org.argeo.cms.swt.widgets.StyledControl;
+import org.argeo.cms.ux.acr.ContentPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** Common logic between single and mutliple terms editable part. */
+public abstract class AbstractTermsPart extends StyledControl implements SwtEditablePart, ContentPart {
+       private static final long serialVersionUID = -5497097995341927710L;
+       protected final TermsManager termsManager;
+       protected final Typology typology;
+
+       private final boolean editable;
+
+       private CmsIcon deleteIcon;
+       private CmsIcon addIcon;
+       private CmsIcon cancelIcon;
+
+       private Color highlightColor;
+       private Composite highlight;
+
+       private boolean canDelete = true;
+
+       protected final CmsSwtTheme theme;
+
+       private int iconsSize = 12;
+
+       private String message;
+
+       @SuppressWarnings("rawtypes")
+       private Class<? extends Enum> localized;
+
+       public AbstractTermsPart(Composite parent, int style, Content item, TermsManager termsManager, String typology) {
+               super(parent, style);
+               if (item == null)
+                       throw new IllegalArgumentException("Item cannot be null");
+               setData(item);
+               this.termsManager = termsManager;
+               this.typology = termsManager.getTypology(typology);
+               this.theme = CmsSwtUtils.getCmsTheme(parent);
+               editable = !(SWT.READ_ONLY == (style & SWT.READ_ONLY));
+               highlightColor = parent.getDisplay().getSystemColor(SWT.COLOR_GRAY);
+       }
+
+       public boolean isEditable() {
+               return editable;
+       }
+
+       protected void createHighlight(Composite block) {
+               highlight = new Composite(block, SWT.NONE);
+               highlight.setBackground(highlightColor);
+               GridData highlightGd = new GridData(SWT.FILL, SWT.FILL, false, false);
+               highlightGd.widthHint = 5;
+               highlightGd.heightHint = 3;
+               highlight.setLayoutData(highlightGd);
+
+       }
+
+       protected String getTermLabel(Term term) {
+               if (term instanceof Localized) {
+                       return ((Localized) term).lead();
+               } else {
+                       if (localized != null) {
+                               @SuppressWarnings("unchecked")
+                               String msg = ((Localized) Enum.valueOf(localized, term.getName())).lead();
+                               return msg;
+                       } else {
+                               return term.getName();
+                       }
+               }
+
+       }
+
+       protected abstract void refresh(ContextOverlay contextArea, String filter, Text txt);
+
+       protected boolean isTermSelectable(Term term) {
+               return true;
+       }
+
+       protected void processTermListLabel(Term term, Text label) {
+
+       }
+
+       protected void setControlLayoutData(Control control) {
+               control.setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       //
+       // STYLING
+       //
+       public void setDeleteIcon(CmsIcon deleteIcon) {
+               this.deleteIcon = deleteIcon;
+       }
+
+       public void setAddIcon(CmsIcon addIcon) {
+               this.addIcon = addIcon;
+       }
+
+       public void setCancelIcon(CmsIcon cancelIcon) {
+               this.cancelIcon = cancelIcon;
+       }
+
+       protected TermsManager getTermsManager() {
+               return termsManager;
+       }
+
+       protected void styleDelete(ToolItem deleteItem) {
+               if (deleteIcon != null)
+                       deleteItem.setImage(theme.getSmallIcon(deleteIcon));
+               else
+                       deleteItem.setText("-");
+       }
+
+       protected void styleCancel(ToolItem cancelItem) {
+               if (cancelIcon != null) {
+                       // cancelItem.setImage(theme.getSmallIcon(cancelIcon));
+                       cancelItem.setImage(theme.getIcon(cancelIcon.name(), iconsSize));
+
+               } else {
+                       cancelItem.setText("X");
+               }
+       }
+
+       protected void styleAdd(ToolItem addItem) {
+               if (addIcon != null) {
+//                     addItem.setImage(theme.getSmallIcon(addIcon));
+                       addItem.setImage(theme.getIcon(addIcon.name(), iconsSize));
+               } else {
+                       addItem.setText("+");
+               }
+       }
+
+       @Override
+       public Content getContent() {
+               return (Content) getData();
+       }
+
+       public void setCanDelete(boolean canDelete) {
+               this.canDelete = canDelete;
+       }
+
+       public boolean isCanDelete() {
+               return canDelete;
+       }
+
+       @SuppressWarnings("rawtypes")
+       public void setLocalized(Class<? extends Enum> localized) {
+               this.localized = localized;
+       }
+
+       public String getMessage() {
+               return message;
+       }
+
+       public void setMessage(String message) {
+               this.message = message;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/MultiTermsPart.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/MultiTermsPart.java
new file mode 100644 (file)
index 0000000..252b597
--- /dev/null
@@ -0,0 +1,208 @@
+package org.argeo.app.swt.terms;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.MouseDoubleClick;
+import org.argeo.cms.swt.MouseDown;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.widgets.ContextOverlay;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** {@link SwtEditablePart} for multiple terms. */
+public class MultiTermsPart extends AbstractTermsPart {
+       private static final long serialVersionUID = -4961135649177920808L;
+       private final static CmsLog log = CmsLog.getLog(MultiTermsPart.class);
+
+       public MultiTermsPart(Composite parent, int style, Content item, TermsManager termsManager, String typology) {
+               super(parent, style, item, termsManager, typology);
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               Composite placeholder = new Composite(box, SWT.NONE);
+
+               boolean vertical = SWT.VERTICAL == (getStyle() & SWT.VERTICAL);
+               RowLayout rl = new RowLayout(vertical ? SWT.VERTICAL : SWT.HORIZONTAL);
+               rl = CmsSwtUtils.noMarginsRowLayout(rl);
+//             rl.wrap = true;
+//             rl.justify = true;
+               placeholder.setLayout(rl);
+               List<Term> currentValue = getValue();
+               if (currentValue != null && !currentValue.isEmpty()) {
+                       for (Term value : currentValue) {
+                               Composite block = new Composite(placeholder, SWT.NONE);
+                               block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+                               Text lbl = new Text(block, SWT.NONE);
+                               lbl.setEditable(false);
+                               String display = getTermLabel(value);
+                               lbl.setText(display);
+                               CmsSwtUtils.style(lbl, style == null ? SuiteStyle.simpleInput.style() : style);
+                               processTermListLabel(value, lbl);
+                               if (isEditable())
+                                       lbl.addMouseListener((MouseDoubleClick) (e) -> {
+                                               startEditing();
+                                       });
+                               if (isEditing()) {
+                                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                                       ToolItem deleteItem = new ToolItem(toolBar, SWT.FLAT);
+                                       styleDelete(deleteItem);
+                                       deleteItem.addSelectionListener((Selected) (e) -> {
+                                               // we retrieve them again here because they may have changed
+                                               List<Term> curr = getValue();
+                                               List<Term> newValue = new ArrayList<>();
+                                               for (Term v : curr) {
+                                                       if (!v.equals(value))
+                                                               newValue.add(v);
+                                               }
+                                               setValue(newValue);
+                                               block.dispose();
+                                               layout(true, true);
+                                       });
+
+                               }
+                       }
+               } else {// empty
+                       if (isEditable() && !isEditing()) {
+                               ToolBar toolBar = new ToolBar(placeholder, SWT.HORIZONTAL);
+                               ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
+                               styleAdd(addItem);
+                               addItem.addSelectionListener((Selected) (e) -> {
+                                       startEditing();
+                               });
+                       }
+               }
+
+               if (isEditing()) {
+                       Composite block = new Composite(placeholder, SWT.NONE);
+                       block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+
+                       createHighlight(block);
+
+                       Text txt = new Text(block, SWT.SINGLE | SWT.BORDER);
+                       txt.setLayoutData(CmsSwtUtils.fillWidth());
+//                     txt.setMessage("[new]");
+
+                       CmsSwtUtils.style(txt, style == null ? SuiteStyle.simpleInput.style() : style);
+
+                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                       ToolItem cancelItem = new ToolItem(toolBar, SWT.FLAT);
+                       styleCancel(cancelItem);
+                       cancelItem.addSelectionListener((Selected) (e) -> {
+                               stopEditing();
+                       });
+
+                       ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
+                               private static final long serialVersionUID = -7980078594405384874L;
+
+                               @Override
+                               protected void onHide() {
+                                       stopEditing();
+                               }
+                       };
+                       contextOverlay.setLayout(new GridLayout());
+                       // filter
+                       txt.addModifyListener((e) -> {
+                               String filter = txt.getText().toLowerCase();
+                               if ("".equals(filter.trim()))
+                                       filter = null;
+                               refresh(contextOverlay, filter, txt);
+                       });
+                       txt.addFocusListener(new FocusListener() {
+                               private static final long serialVersionUID = -6024501573409619949L;
+
+                               @Override
+                               public void focusLost(FocusEvent event) {
+//                                     if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
+//                                             getDisplay().asyncExec(() -> stopEditing());
+                               }
+
+                               @Override
+                               public void focusGained(FocusEvent event) {
+                                       // txt.setText("");
+                                       if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
+                                               refresh(contextOverlay, null, txt);
+                               }
+                       });
+                       layout(new Control[] { txt });
+                       // getDisplay().asyncExec(() -> txt.setFocus());
+               }
+               return placeholder;
+       }
+
+       @Override
+       protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
+               CmsSwtUtils.clear(contextArea);
+               List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
+               List<Term> currentValue = getValue();
+               terms: for (Term term : terms) {
+                       if (currentValue != null && currentValue.contains(term))
+                               continue terms;
+                       String display = getTermLabel(term);
+                       if (filter != null && !display.toLowerCase().contains(filter))
+                               continue terms;
+                       Text termL = new Text(contextArea, SWT.WRAP);
+                       termL.setEditable(false);
+                       termL.setText(display);
+                       processTermListLabel(term, termL);
+                       if (isTermSelectable(term))
+                               termL.addMouseListener((MouseDown) (e) -> {
+                                       List<Term> newValue = new ArrayList<>();
+                                       List<Term> curr = getValue();
+                                       if (currentValue != null)
+                                               newValue.addAll(curr);
+                                       newValue.add(term);
+                                       setValue(newValue);
+                                       contextArea.hide();
+                                       stopEditing();
+                               });
+               }
+               contextArea.show();
+       }
+
+       protected List<Term> getValue() {
+               String property = typology.getId();
+               List<String> curr = getContent().getMultiple(NamespaceUtils.unqualified(property));
+//             List<String> curr = Jcr.getMultiple(getNode(), property);
+               List<Term> res = new ArrayList<>();
+               if (curr != null)
+                       terms: for (String str : curr) {
+                               Term term = termsManager.getTerm(str);
+                               if (term == null) {
+                                       log.warn("Ignoring term " + str + " for " + getContent() + ", as it was not found.");
+                                       continue terms;
+                               }
+                               res.add(term);
+                       }
+               return res;
+       }
+
+       protected void setValue(List<Term> value) {
+               String property = typology.getId();
+               List<String> ids = new ArrayList<>();
+               for (Term term : value) {
+                       ids.add(term.getId());
+               }
+               getContent().put(property, ids);
+//             Jcr.set(getNode(), property, ids);
+//             Jcr.save(getNode());
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/SingleTermPart.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/SingleTermPart.java
new file mode 100644 (file)
index 0000000..c824173
--- /dev/null
@@ -0,0 +1,172 @@
+package org.argeo.app.swt.terms;
+
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.MouseDoubleClick;
+import org.argeo.cms.swt.MouseDown;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.widgets.ContextOverlay;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** {@link SwtEditablePart} for terms. */
+public class SingleTermPart extends AbstractTermsPart {
+       private static final long serialVersionUID = -4961135649177920808L;
+
+       public SingleTermPart(Composite parent, int style, Content item, TermsManager termsManager, String typology) {
+               super(parent, style, item, termsManager, typology);
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               if (isEditing()) {
+                       Composite block = new Composite(box, SWT.NONE);
+                       block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+
+                       createHighlight(block);
+
+                       Text txt = new Text(block, SWT.SINGLE);
+                       CmsSwtUtils.style(txt, style == null ? SuiteStyle.simpleInput.style() : style);
+
+                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                       if (isCanDelete()) {
+                               ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
+                               styleDelete(deleteItem);
+                               deleteItem.addSelectionListener((Selected) (e) -> {
+                                       setValue(null);
+                                       stopEditing();
+                               });
+                       }
+                       ToolItem cancelItem = new ToolItem(toolBar, SWT.PUSH);
+                       styleCancel(cancelItem);
+                       cancelItem.addSelectionListener((Selected) (e) -> {
+                               stopEditing();
+                       });
+
+                       ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
+                               private static final long serialVersionUID = -7980078594405384874L;
+
+                               @Override
+                               protected void onHide() {
+                                       stopEditing();
+                               }
+                       };
+                       contextOverlay.setLayout(new GridLayout());
+                       // filter
+                       txt.addModifyListener((e) -> {
+                               String filter = txt.getText().toLowerCase();
+                               if ("".equals(filter.trim()))
+                                       filter = null;
+                               refresh(contextOverlay, filter, txt);
+                       });
+                       txt.addFocusListener(new FocusListener() {
+                               private static final long serialVersionUID = -6024501573409619949L;
+
+                               @Override
+                               public void focusLost(FocusEvent event) {
+//                                     if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
+//                                             getDisplay().asyncExec(() -> stopEditing());
+                               }
+
+                               @Override
+                               public void focusGained(FocusEvent event) {
+                                       // txt.setText("");
+                                       if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
+                                               refresh(contextOverlay, null, txt);
+                               }
+                       });
+                       layout(new Control[] { block });
+                       getDisplay().asyncExec(() -> txt.setFocus());
+                       return block;
+               } else {
+                       Composite block = new Composite(box, SWT.NONE);
+                       block.setLayout(CmsSwtUtils.noSpaceGridLayout(2));
+                       Term currentValue = getValue();
+                       if (currentValue != null) {
+                               Text lbl = new Text(block, SWT.SINGLE);
+                               lbl.setEditable(false);
+                               String display = getTermLabel(currentValue);
+                               lbl.setText(display);
+                               CmsSwtUtils.style(lbl, style == null ? SuiteStyle.simpleInput.style() : style);
+                               processTermListLabel(currentValue, lbl);
+                               if (isEditable()) {
+                                       lbl.addMouseListener((MouseDoubleClick) (e) -> {
+                                               startEditing();
+                                       });
+                               }
+                       } else {
+                               if (isEditable()) {
+
+                                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                                       ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
+                                       styleAdd(addItem);
+                                       addItem.addSelectionListener((Selected) (e) -> {
+                                               startEditing();
+                                       });
+                               }
+                               // add dummy text so that height wont's move afterwards
+                               Text lbl = new Text(block, SWT.SINGLE);
+                               lbl.setEditable(false);
+                               if (!isEditable()) {// empty, non editable
+                                       if (getMessage() != null)
+                                               lbl.setMessage(getMessage());
+                               }
+                       }
+                       return block;
+               }
+       }
+
+       @Override
+       protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
+               CmsSwtUtils.clear(contextArea);
+               List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
+               terms: for (Term term : terms) {
+                       String display = getTermLabel(term);
+                       if (filter != null && !display.toLowerCase().contains(filter))
+                               continue terms;
+                       Text termL = new Text(contextArea, SWT.WRAP);
+                       termL.setEditable(false);
+                       termL.setText(display);
+                       processTermListLabel(term, termL);
+                       if (isTermSelectable(term))
+                               termL.addMouseListener((MouseDown) (e) -> {
+                                       setValue(term);
+                                       contextArea.hide();
+                                       stopEditing();
+                               });
+               }
+               contextArea.show();
+               // txt.setFocus();
+       }
+
+       protected Term getValue() {
+               String property = typology.getId();
+               String id = getContent().attr(property);
+               Term term = termsManager.getTerm(id);
+
+               return term;
+       }
+
+       protected void setValue(Term value) {
+               String property = typology.getId();
+               if (value == null)
+                       getContent().remove(property);
+               else
+                       getContent().put(property, value.getId());
+//             Jcr.set(getNode(), property, value != null ? value.getId() : null);
+//             Jcr.save(getNode());
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/TermsEntryArea.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/terms/TermsEntryArea.java
new file mode 100644 (file)
index 0000000..8c645ad
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.app.swt.terms;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.TermsManager;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.widgets.SwtTreeView;
+import org.argeo.cms.ux.acr.ContentHierarchicalPart;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Entry area for managing the typologies. */
+public class TermsEntryArea implements SwtUiProvider {
+       private TermsManager termsManager;
+
+       @Override
+       public Control createUiPart(Composite parent, Content content) {
+//             parent.setLayout(new GridLayout());
+//             Label lbl = new Label(parent, SWT.NONE);
+//             lbl.setText("Typologies");
+//
+//             Set<Typology> typologies = termsManager.getTypologies();
+//             for (Typology typology : typologies) {
+//                     new Label(parent, 0).setText(typology.getId());
+//             }
+//             
+//             
+//             return lbl;
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+
+               parent.setLayout(new GridLayout());
+               Content rootContent = ((ProvidedContent) content).getSession().getRepository().get().get("/terms");
+
+               ContentHierarchicalPart contentPart = new ContentHierarchicalPart() {
+
+                       @Override
+                       protected boolean isLeaf(Content content) {
+                               if (content.hasContentClass(EntityType.document.qName()))
+                                       return true;
+                               return super.isLeaf(content);
+                       }
+
+               };
+               contentPart.addColumn((c) -> NamespaceUtils.toPrefixedName(c.getName()));
+//             contentPart.setInput(rootContent);
+
+               SwtTreeView<Content> view = new SwtTreeView<>(parent, 0, contentPart);
+               view.setLayoutData(CmsSwtUtils.fillAll());
+
+               contentPart.setInput(rootContent);
+//             contentPart.onSelected((o) -> {
+//                     Content c = (Content) o;
+////                   log.debug(c.getPath());
+//                     cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(c));
+//             });
+               return view;
+
+       }
+
+       public void setTermsManager(TermsManager termsManager) {
+               this.termsManager = termsManager;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultEditionLayer.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultEditionLayer.java
new file mode 100644 (file)
index 0000000..549062f
--- /dev/null
@@ -0,0 +1,322 @@
+package org.argeo.app.swt.ux;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.argeo.api.acr.Content;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtTabbedArea;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.util.LangUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.wiring.BundleWiring;
+
+/** An app layer based on an entry area and an editor area. */
+public class DefaultEditionLayer implements SwtAppLayer {
+       private String id;
+       private SwtUiProvider entryArea;
+       private SwtUiProvider defaultView;
+       private SwtUiProvider workArea;
+       private List<String> weights = new ArrayList<>();
+       private boolean startMaximized = false;
+       private boolean fixedEntryArea = false;
+       private boolean singleTab = false;
+       private Localized title = null;
+       private Localized singleTabTitle = null;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               // TODO Factorize more, or split into more specialised classes?
+               if (entryArea != null) {
+                       if (fixedEntryArea) {
+                               FixedEditionArea editionArea = new FixedEditionArea(parent, parent.getStyle());
+                               Control entryAreaC = entryArea.createUiPart(editionArea.getEntryArea(), context);
+                               CmsSwtUtils.style(entryAreaC, SuiteStyle.entryArea);
+                               if (this.defaultView != null) {
+                                       editionArea.getTabbedArea().view(defaultView, context);
+                               }
+                               return editionArea;
+                       } else {
+                               SashFormEditionArea editionArea = new SashFormEditionArea(parent, parent.getStyle());
+                               entryArea.createUiPart(editionArea.getEntryArea(), context);
+                               if (this.defaultView != null) {
+                                       editionArea.getTabbedArea().view(defaultView, context);
+                               }
+                               return editionArea;
+                       }
+               } else {
+                       if (this.workArea != null) {
+                               Composite area = new Composite(parent, SWT.NONE);
+                               // we set fill layout by default but it can be overridden
+                               area.setLayout(new FillLayout());
+                               this.workArea.createUiPart(area, context);
+                               return area;
+                       }
+                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+                       SwtTabbedArea tabbedArea = createTabbedArea(parent, theme);
+                       return tabbedArea;
+               }
+       }
+
+       @Override
+       public void view(SwtUiProvider uiProvider, Composite workAreaC, Content context) {
+               if (workArea != null) {
+                       CmsSwtUtils.clear(workAreaC);
+                       workArea.createUiPart(workAreaC, context);
+                       workAreaC.layout(true, true);
+                       return;
+               }
+
+               // tabbed area
+               SwtTabbedArea tabbedArea = findTabbedArea(workAreaC);
+               if (tabbedArea == null)
+                       throw new IllegalArgumentException("Unsupported work area " + workAreaC.getClass().getName());
+               if (uiProvider == null) {
+                       // reset
+                       tabbedArea.closeAllTabs();
+                       if (this.defaultView != null) {
+                               tabbedArea.view(defaultView, context);
+                       }
+               } else {
+                       tabbedArea.view(uiProvider, context);
+               }
+       }
+
+       @Override
+       public Content getCurrentContext(Composite workArea) {
+               SwtTabbedArea tabbedArea = findTabbedArea(workArea);
+               if (tabbedArea == null)
+                       return null;
+               return tabbedArea.getCurrentContext();
+       }
+
+       private SwtTabbedArea findTabbedArea(Composite workArea) {
+               SwtTabbedArea tabbedArea = null;
+               if (workArea instanceof SashFormEditionArea) {
+                       tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
+               } else if (workArea instanceof FixedEditionArea) {
+                       tabbedArea = ((FixedEditionArea) workArea).getTabbedArea();
+               } else if (workArea instanceof SwtTabbedArea) {
+                       tabbedArea = (SwtTabbedArea) workArea;
+               }
+               return tabbedArea;
+       }
+
+       @Override
+       public void open(SwtUiProvider uiProvider, Composite workArea, Content context) {
+               SwtTabbedArea tabbedArea = ((SashFormEditionArea) workArea).getTabbedArea();
+               tabbedArea.open(uiProvider, context);
+       }
+
+       @Override
+       public Localized getTitle() {
+               return title;
+       }
+
+       @Override
+       public String getId() {
+               return id;
+       }
+
+       public void init(BundleContext bundleContext, Map<String, Object> properties) {
+               String pid = (String) properties.get(Constants.SERVICE_PID);
+               id = pid;
+               Objects.requireNonNull(id, "Layer id must be set.");
+
+               weights = LangUtils.toStringList(properties.get(Property.weights.name()));
+               startMaximized = properties.containsKey(Property.startMaximized.name())
+                               && "true".equals(properties.get(Property.startMaximized.name()));
+               fixedEntryArea = properties.containsKey(Property.fixedEntryArea.name())
+                               && "true".equals(properties.get(Property.fixedEntryArea.name()));
+               if (fixedEntryArea && weights.size() != 0) {
+                       throw new IllegalArgumentException("Property " + Property.weights.name() + " should not be set if property "
+                                       + Property.fixedEntryArea.name() + " is set.");
+               }
+               singleTab = properties.containsKey(Property.singleTab.name())
+                               && "true".equals(properties.get(Property.singleTab.name()));
+
+               String titleStr = (String) properties.get(SwtAppLayer.Property.title.name());
+               if (titleStr != null) {
+                       if (titleStr.startsWith("%")) {
+                               title = new Localized() {
+
+                                       @Override
+                                       public String name() {
+                                               return titleStr;
+                                       }
+
+                                       @Override
+                                       public ClassLoader getL10nClassLoader() {
+                                               return bundleContext != null
+                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
+                                                               : getClass().getClassLoader();
+                                       }
+                               };
+                       } else {
+                               title = new Localized.Untranslated(titleStr);
+                       }
+               }
+
+               String singleTabTitleStr = (String) properties.get(SwtAppLayer.Property.singleTabTitle.name());
+               if (singleTabTitleStr != null) {
+                       if (singleTabTitleStr.startsWith("%")) {
+                               singleTabTitle = new Localized() {
+
+                                       @Override
+                                       public String name() {
+                                               return singleTabTitleStr;
+                                       }
+
+                                       @Override
+                                       public ClassLoader getL10nClassLoader() {
+                                               return bundleContext != null
+                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
+                                                               : getClass().getClassLoader();
+                                       }
+                               };
+                       } else {
+                               singleTabTitle = new Localized.Untranslated(singleTabTitleStr);
+                       }
+               }
+
+       }
+
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+
+       }
+
+       public void setEntryArea(SwtUiProvider entryArea) {
+               this.entryArea = entryArea;
+       }
+
+       public void setWorkArea(SwtUiProvider workArea) {
+               this.workArea = workArea;
+       }
+
+       public void setDefaultView(SwtUiProvider defaultView) {
+               this.defaultView = defaultView;
+       }
+
+       SwtTabbedArea createTabbedArea(Composite parent, CmsSwtTheme theme) {
+               SwtTabbedArea tabbedArea = new SwtTabbedArea(parent, SWT.NONE);
+               tabbedArea.setSingleTab(singleTab);
+               if (singleTabTitle != null)
+                       tabbedArea.setSingleTabTitle(singleTabTitle.lead());
+               tabbedArea.setBodyStyle(SuiteStyle.mainTabBody.style());
+               tabbedArea.setTabStyle(SuiteStyle.mainTab.style());
+               tabbedArea.setTabSelectedStyle(SuiteStyle.mainTabSelected.style());
+               tabbedArea.setCloseIcon(theme.getSmallIcon(SuiteIcon.close));
+               tabbedArea.setLayoutData(CmsSwtUtils.fillAll());
+               return tabbedArea;
+       }
+
+//     /** A work area based on an entry area and and a tabbed area. */
+       class SashFormEditionArea extends SashForm {
+               private static final long serialVersionUID = 2219125778722702618L;
+               private SwtTabbedArea tabbedArea;
+               private Composite entryC;
+
+               SashFormEditionArea(Composite parent, int style) {
+                       super(parent, SWT.HORIZONTAL);
+                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
+                       Composite editorC;
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               editorC = new Composite(this, SWT.BORDER);
+                               entryC = new Composite(this, SWT.BORDER);
+                       } else {
+                               entryC = new Composite(this, SWT.NONE);
+                               editorC = new Composite(this, SWT.NONE);
+                       }
+
+                       // sash form specific
+                       if (weights.size() != 0) {
+                               int[] actualWeight = new int[weights.size()];
+                               for (int i = 0; i < weights.size(); i++) {
+                                       actualWeight[i] = Integer.parseInt(weights.get(i));
+                               }
+                               setWeights(actualWeight);
+                       } else {
+                               int[] actualWeights = new int[] { 3000, 7000 };
+                               setWeights(actualWeights);
+                       }
+                       if (startMaximized)
+                               setMaximizedControl(editorC);
+
+                       GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
+//                     editorAreaLayout.verticalSpacing = 0;
+//                     editorAreaLayout.marginBottom = 0;
+//                     editorAreaLayout.marginHeight = 0;
+//                     editorAreaLayout.marginLeft = 0;
+//                     editorAreaLayout.marginRight = 0;
+                       editorC.setLayout(editorAreaLayout);
+
+                       tabbedArea = createTabbedArea(editorC, theme);
+               }
+
+               SwtTabbedArea getTabbedArea() {
+                       return tabbedArea;
+               }
+
+               Composite getEntryArea() {
+                       return entryC;
+               }
+
+       }
+
+       class FixedEditionArea extends Composite {
+               private static final long serialVersionUID = -5525672639277322465L;
+               private SwtTabbedArea tabbedArea;
+               private Composite entryC;
+
+               public FixedEditionArea(Composite parent, int style) {
+                       super(parent, style);
+                       CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
+                       setLayout(CmsSwtUtils.noSpaceGridLayout(2));
+
+                       Composite editorC;
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               editorC = new Composite(this, SWT.NONE);
+                               entryC = new Composite(this, SWT.NONE);
+                       } else {
+                               entryC = new Composite(this, SWT.NONE);
+                               editorC = new Composite(this, SWT.NONE);
+                       }
+                       entryC.setLayoutData(CmsSwtUtils.fillHeight());
+
+                       GridLayout editorAreaLayout = CmsSwtUtils.noSpaceGridLayout();
+//                     editorAreaLayout.verticalSpacing = 0;
+//                     editorAreaLayout.marginBottom = 0;
+//                     editorAreaLayout.marginHeight = 0;
+//                     editorAreaLayout.marginLeft = 0;
+//                     editorAreaLayout.marginRight = 0;
+                       editorC.setLayout(editorAreaLayout);
+                       editorC.setLayoutData(CmsSwtUtils.fillAll());
+
+                       tabbedArea = createTabbedArea(editorC, theme);
+               }
+
+               SwtTabbedArea getTabbedArea() {
+                       return tabbedArea;
+               }
+
+               Composite getEntryArea() {
+                       return entryC;
+               }
+       }
+
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultFooter.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultFooter.java
new file mode 100644 (file)
index 0000000..303952d
--- /dev/null
@@ -0,0 +1,38 @@
+package org.argeo.app.swt.ux;
+
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.osgi.framework.BundleContext;
+
+/** Footer of a standard Argeo Suite application. */
+public class DefaultFooter implements SwtUiProvider {
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               Composite content = new Composite(parent, SWT.NONE);
+               content.setLayoutData(new GridData(0, 0));
+               Control contentControl = createContent(content, context);
+
+               // TODO support and guarantee
+
+               return contentControl;
+       }
+
+       protected Control createContent(Composite parent, Content context) {
+               return parent;
+       }
+
+       public void init(BundleContext bundleContext, Map<String, String> properties) {
+       }
+
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultHeader.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultHeader.java
new file mode 100644 (file)
index 0000000..36b37bf
--- /dev/null
@@ -0,0 +1,128 @@
+package org.argeo.app.swt.ux;
+
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.wiring.BundleWiring;
+
+/** Header of a standard Argeo Suite application. */
+public class DefaultHeader implements SwtUiProvider {
+       public final static String TITLE_PROPERTY = "argeo.suite.ui.header.title";
+       private Localized title = null;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
+               parent.setLayout(CmsSwtUtils.noSpaceGridLayout(new GridLayout(3, true)));
+
+               // TODO right to left
+               Composite lead = new Composite(parent, SWT.NONE);
+               CmsSwtUtils.style(lead, SuiteStyle.header);
+               lead.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, true, false));
+               lead.setLayout(new GridLayout());
+               Label lbl = new Label(lead, SWT.NONE);
+//             String title = properties.get(TITLE_PROPERTY);
+//             // TODO expose the localized
+//             lbl.setText(LocaleUtils.isLocaleKey(title) ? LocaleUtils.local(title, getClass().getClassLoader()).toString()
+//                             : title);
+               lbl.setText(title.lead());
+               CmsSwtUtils.style(lbl, SuiteStyle.headerTitle);
+               lbl.setLayoutData(CmsSwtUtils.fillWidth());
+
+               Composite middle = new Composite(parent, SWT.NONE);
+               CmsSwtUtils.style(middle, SuiteStyle.header);
+               middle.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false));
+               middle.setLayout(new GridLayout());
+
+               Composite end = new Composite(parent, SWT.NONE);
+               CmsSwtUtils.style(end, SuiteStyle.header);
+               end.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
+
+               if (!cmsView.isAnonymous()) {
+                       end.setLayout(new GridLayout(2, false));
+                       Label userL = new Label(end, SWT.NONE);
+                       CmsSwtUtils.style(userL, SuiteStyle.header);
+                       userL.setText(CurrentUser.getDisplayName());
+//                     Button logoutB = new Button(end, SWT.FLAT);
+//                     logoutB.setImage(theme.getSmallIcon(SuiteIcon.logout));
+//                     logoutB.addSelectionListener(new SelectionAdapter() {
+//                             private static final long serialVersionUID = 7116760083964201233L;
+//
+//                             @Override
+//                             public void widgetSelected(SelectionEvent e) {
+//                                     cmsView.logout();
+//                             }
+//
+//                     });
+                       Label logOutL = new Label(end, 0);
+                       logOutL.setImage(theme.getSmallIcon(SuiteIcon.openUserMenu));
+                       logOutL.addMouseListener(new MouseAdapter() {
+                               private static final long serialVersionUID = 6908266850511460799L;
+
+                               @Override
+                               public void mouseDown(MouseEvent e) {
+                                       cmsView.logout();
+                               }
+
+                       });
+               } else {
+                       end.setLayout(new GridLayout(1, false));
+                       // required in order to avoid wrong height after logout
+                       new Label(end, SWT.NONE).setText("");
+
+               }
+               return lbl;
+       }
+
+       public void init(BundleContext bundleContext, Map<String, String> properties) {
+               String titleStr = (String) properties.get(TITLE_PROPERTY);
+               if (titleStr != null) {
+                       if (titleStr.startsWith("%")) {
+                               title = new Localized() {
+
+                                       @Override
+                                       public String name() {
+                                               return titleStr;
+                                       }
+
+                                       @Override
+                                       public ClassLoader getL10nClassLoader() {
+                                               return bundleContext != null
+                                                               ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
+                                                               : getClass().getClassLoader();
+                                       }
+                               };
+                       } else {
+                               title = new Localized.Untranslated(titleStr);
+                       }
+               }
+       }
+
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+
+       }
+
+       public Localized getTitle() {
+               return title;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultLeadPane.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultLeadPane.java
new file mode 100644 (file)
index 0000000..a46112b
--- /dev/null
@@ -0,0 +1,223 @@
+package org.argeo.app.swt.ux;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.RankedObject;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.CmsIcon;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.core.SuiteUtils;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.LocaleUtils;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.wiring.BundleWiring;
+
+/** Side pane listing various perspectives. */
+public class DefaultLeadPane implements SwtUiProvider {
+       private final static CmsLog log = CmsLog.getLog(DefaultLeadPane.class);
+
+       public static enum Property {
+               defaultLayers, adminLayers;
+       }
+
+       private Map<String, RankedObject<SwtAppLayer>> layers = Collections.synchronizedSortedMap(new TreeMap<>());
+       private List<String> defaultLayers;
+       private List<String> adminLayers = new ArrayList<>();
+
+       private ClassLoader l10nClassLoader;
+
+       @Override
+       public Control createUiPart(Composite parent, Content node) {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               Composite appLayersC = new Composite(parent, SWT.NONE);
+               CmsSwtUtils.style(appLayersC, SuiteStyle.leadPane);
+               GridLayout layout = new GridLayout();
+               layout.verticalSpacing = 10;
+               layout.marginTop = 10;
+               layout.marginLeft = 10;
+               layout.marginRight = 10;
+               appLayersC.setLayout(layout);
+               appLayersC.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+
+               Composite adminLayersC;
+               if (!adminLayers.isEmpty()) {
+                       adminLayersC = new Composite(parent, SWT.NONE);
+                       CmsSwtUtils.style(adminLayersC, SuiteStyle.leadPane);
+                       GridLayout adminLayout = new GridLayout();
+                       adminLayout.verticalSpacing = 10;
+                       adminLayout.marginBottom = 10;
+                       adminLayout.marginLeft = 10;
+                       adminLayout.marginRight = 10;
+                       adminLayersC.setLayout(adminLayout);
+                       adminLayersC.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, true));
+               } else {
+                       adminLayersC = null;
+               }
+
+//             boolean isAdmin = cmsView.doAs(() -> CurrentUser.isInRole(NodeConstants.ROLE_USER_ADMIN));
+               // Set<String> userRoles = cmsView.doAs(() -> CurrentUser.roles());
+               Button first = null;
+               layers: for (String layerDef : defaultLayers) {
+                       layerDef = layerDef.trim();
+                       if ("".equals(layerDef))
+                               continue layers;// skip empty lines
+                       String[] semiColArr = layerDef.split(";");
+                       String layerId = semiColArr[0];
+                       Set<String> layerRoles = SuiteUtils.extractRoles(semiColArr);
+                       if (layers.containsKey(layerId)) {
+                               if (!layerRoles.isEmpty()) {
+                                       boolean authorized = false;
+                                       authorized = cmsView.doAs(() -> {
+                                               for (String layerRole : layerRoles) {
+                                                       if (CurrentUser.implies(layerRole, null)) {
+                                                               return true;
+                                                       }
+                                               }
+                                               return false;
+                                       });
+                                       if (!authorized)
+                                               continue layers;// skip unauthorized layer
+//                                     Set<String> intersection = new HashSet<String>(layerRoles);
+//                                     intersection.retainAll(userRoles);
+//                                     if (intersection.isEmpty())
+//                                             continue layers;// skip unauthorized layer
+                               }
+                               RankedObject<SwtAppLayer> layerObj = layers.get(layerId);
+
+                               Localized title = null;
+                               if (!adminLayers.contains(layerId)) {
+                                       String titleStr = (String) layerObj.getProperties().get(SwtAppLayer.Property.title.name());
+                                       if (titleStr != null) {
+                                               if (titleStr.startsWith("%")) {
+                                                       // LocaleUtils.local(titleStr, getClass().getClassLoader());
+                                                       title = () -> titleStr;
+                                               } else {
+                                                       title = new Localized.Untranslated(titleStr);
+                                               }
+                                       }
+                               }
+
+                               String iconName = (String) layerObj.getProperties().get(SwtAppLayer.Property.icon.name());
+                               SuiteIcon icon = null;
+                               if (iconName != null)
+                                       icon = SuiteIcon.valueOf(iconName);
+
+                               Composite buttonParent;
+                               if (adminLayers.contains(layerId))
+                                       buttonParent = adminLayersC;
+                               else
+                                       buttonParent = appLayersC;
+                               Button b = createLayerButton(buttonParent, layerId, title, icon, l10nClassLoader);
+                               if (first == null)
+                                       first = b;
+                       }
+               }
+               return first;
+       }
+
+       protected Button createLayerButton(Composite parent, String layer, Localized msg, CmsIcon icon,
+                       ClassLoader l10nClassLoader) {
+               CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+               Button button = new Button(parent, SWT.PUSH);
+               CmsSwtUtils.style(button, SuiteStyle.leadPane);
+               if (icon != null)
+                       button.setImage(theme.getBigIcon(icon));
+               button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false));
+               // button.setToolTipText(msg.lead());
+               if (msg != null) {
+                       Label lbl = new Label(parent, SWT.CENTER);
+                       CmsSwtUtils.style(lbl, SuiteStyle.leadPane);
+                       String txt = LocaleUtils.lead(msg, l10nClassLoader);
+//                     String txt = msg.lead();
+                       lbl.setText(txt);
+                       lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
+               }
+               CmsSwtUtils.sendEventOnSelect(button, SuiteUxEvent.switchLayer.topic(), SuiteUxEvent.LAYER, layer);
+               return button;
+       }
+
+       public void init(BundleContext bundleContext, Map<String, Object> properties) {
+               l10nClassLoader = bundleContext != null ? bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader()
+                               : getClass().getClassLoader();
+
+               String[] defaultLayers = (String[]) properties.get(Property.defaultLayers.toString());
+               if (defaultLayers == null)
+                       throw new IllegalArgumentException("Default layers must be set.");
+               this.defaultLayers = Arrays.asList(defaultLayers);
+               if (log.isDebugEnabled())
+                       log.debug("Default layers: " + Arrays.asList(defaultLayers));
+               String[] adminLayers = (String[]) properties.get(Property.adminLayers.toString());
+               if (adminLayers != null) {
+                       this.adminLayers = Arrays.asList(adminLayers);
+                       if (log.isDebugEnabled())
+                               log.debug("Admin layers: " + Arrays.asList(adminLayers));
+               }
+       }
+
+       public void destroy(BundleContext bundleContext, Map<String, String> properties) {
+
+       }
+
+       public void addLayer(SwtAppLayer layer, Map<String, Object> properties) {
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       String pid = (String) properties.get(Constants.SERVICE_PID);
+                       RankedObject.putIfHigherRank(layers, pid, layer, properties);
+               }
+       }
+
+       public void removeLayer(SwtAppLayer layer, Map<String, Object> properties) {
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       String pid = (String) properties.get(Constants.SERVICE_PID);
+                       if (layers.containsKey(pid)) {
+                               if (layers.get(pid).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
+                                       layers.remove(pid);
+                               }
+                       }
+               }
+       }
+
+//     protected Button createLayerButton(Composite parent, String layer, Localized msg, CmsIcon icon) {
+//             CmsTheme theme = CmsTheme.getCmsTheme(parent);
+//             Button button = new Button(parent, SWT.PUSH);
+//             CmsUiUtils.style(button, SuiteStyle.leadPane);
+//             if (icon != null)
+//                     button.setImage(icon.getBigIcon(theme));
+//             button.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, true, false));
+//             // button.setToolTipText(msg.lead());
+//             if (msg != null) {
+//                     Label lbl = new Label(parent, SWT.CENTER);
+//                     CmsUiUtils.style(lbl, SuiteStyle.leadPane);
+//                     // CmsUiUtils.markup(lbl);
+//                     ClassLoader l10nClassLoader = getClass().getClassLoader();
+//                     String txt = LocaleUtils.lead(msg, l10nClassLoader);
+////                   String txt = msg.lead();
+//                     lbl.setText(txt);
+//                     lbl.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, true, false));
+//             }
+//             CmsUiUtils.sendEventOnSelect(button, SuiteEvent.switchLayer.topic(), SuiteEvent.LAYER, layer);
+//             return button;
+//     }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultLoginScreen.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/DefaultLoginScreen.java
new file mode 100644 (file)
index 0000000..326ed4f
--- /dev/null
@@ -0,0 +1,39 @@
+package org.argeo.app.swt.ux;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.CmsContext;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.auth.CmsLogin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Provides a login screen. */
+public class DefaultLoginScreen implements SwtUiProvider {
+       private CmsContext cmsContext;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               if (!cmsView.isAnonymous())
+                       throw new IllegalStateException(CurrentUser.getUsername() + " is already logged in");
+
+               parent.setLayout(new GridLayout());
+               Composite loginArea = new Composite(parent, SWT.NONE);
+               loginArea.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+
+               CmsLogin cmsLogin = new CmsLogin(cmsView, cmsContext);
+               cmsLogin.createUi(loginArea);
+               return cmsLogin.getCredentialsBlock();
+       }
+
+       public void setCmsContext(CmsContext cmsContext) {
+               this.cmsContext = cmsContext;
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SuiteSwtUtils.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SuiteSwtUtils.java
new file mode 100644 (file)
index 0000000..66e8463
--- /dev/null
@@ -0,0 +1,453 @@
+package org.argeo.app.swt.ux;
+
+import java.util.function.Predicate;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.QNamed;
+import org.argeo.api.cms.ux.Cms2DSize;
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.api.cms.ux.CmsStyle;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.Localized;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.Img;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.swt.dialogs.LightweightDialog;
+import org.argeo.cms.swt.widgets.CmsLink;
+import org.argeo.cms.swt.widgets.EditableText;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** Static utilities implementing the look and feel of Argeo Suite with SWT. */
+public class SuiteSwtUtils {
+       /** creates a title bar composite with label and optional button */
+       public static Composite addTitleBar(Composite parent, Localized title) {
+               return addTitleBar(parent, title.lead());
+       }
+
+       /** creates a title bar composite with label and optional button */
+       public static Composite addTitleBar(Composite parent, String title) {
+               Composite titleBar = new Composite(parent, SWT.NONE);
+               titleBar.setLayoutData(CmsSwtUtils.fillWidth());
+               CmsSwtUtils.style(titleBar, SuiteStyle.titleContainer);
+
+               titleBar.setLayout(CmsSwtUtils.noSpaceGridLayout(new GridLayout(2, false)));
+               Label titleLbl = new Label(titleBar, SWT.NONE);
+               titleLbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
+               CmsSwtUtils.style(titleLbl, SuiteStyle.titleLabel);
+               titleLbl.setText(title);
+
+//             if (isEditable) {
+//                     Button editBtn = new Button(titleBar, SWT.PUSH);
+//                     editBtn.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+//                     CmsSwtUtils.style(editBtn, SuiteStyle.inlineButton);
+//                     editBtn.setText("Edit");
+//             }
+               return titleBar;
+       }
+
+       public static Label addFormLabel(Composite parent, String label) {
+               Label lbl = new Label(parent, SWT.WRAP);
+               lbl.setText(label);
+               lbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+               CmsSwtUtils.style(lbl, SuiteStyle.simpleLabel);
+               return lbl;
+       }
+
+       public static Label addFormLabel(Composite parent, Localized msg) {
+               return addFormLabel(parent, msg.lead());
+       }
+
+       public static Text addFormTextField(Composite parent, String text, String message, int style) {
+               Text txt = new Text(parent, style);
+               if (text != null)
+                       txt.setText(text);
+               if (message != null)
+                       txt.setMessage(message);
+               txt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
+               CmsSwtUtils.style(txt, SuiteStyle.simpleInput);
+               return txt;
+       }
+
+       public static Text addFormTextField(Composite parent, String text, String message) {
+               return addFormTextField(parent, text, message, SWT.NONE);
+       }
+
+//     public static Text addFormInputField(Composite parent, String placeholder) {
+//             Text txt = new Text(parent, SWT.BORDER);
+//
+//             GridData gridData = CmsSwtUtils.fillWidth();
+//             txt.setLayoutData(gridData);
+//
+//             if (placeholder != null)
+//                     txt.setText(placeholder);
+//
+//             CmsSwtUtils.style(txt, SuiteStyle.simpleInput);
+//             return txt;
+//     }
+
+       public static Composite addLineComposite(Composite parent, int columns) {
+               Composite lineComposite = new Composite(parent, SWT.NONE);
+               GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
+               lineComposite.setLayoutData(gd);
+               lineComposite.setLayout(new GridLayout(columns, false));
+               CmsSwtUtils.style(lineComposite, SuiteStyle.formLine);
+               return lineComposite;
+       }
+
+       /** creates a single horizontal-block composite for key:value display */
+       public static Text addFormLine(Composite parent, Localized label, String text) {
+               return addFormLine(parent, label.lead(), text);
+       }
+
+       /** creates a single horizontal-block composite for key:value display */
+       public static Text addFormLine(Composite parent, String label, String text) {
+               Composite lineComposite = addLineComposite(parent, 2);
+               CmsSwtUtils.style(lineComposite, SuiteStyle.formLine);
+               addFormLabel(lineComposite, label);
+               Text txt = addFormTextField(lineComposite, text, null);
+               txt.setEditable(false);
+               txt.setLayoutData(CmsSwtUtils.fillWidth());
+               return txt;
+       }
+
+//     public static Text addFormInput(Composite parent, String label, String placeholder) {
+//             Composite lineComposite = addLineComposite(parent, 2);
+//             addFormLabel(lineComposite, label);
+//             Text txt = addFormInputField(lineComposite, placeholder);
+//             txt.setLayoutData(CmsSwtUtils.fillWidth());
+//             return txt;
+//     }
+
+       /**
+        * creates a single horizontal-block composite for key:value display, with
+        * offset value
+        */
+       public static Text addFormLine(Composite parent, String label, String text, Integer offset) {
+               Composite lineComposite = addLineComposite(parent, 3);
+               Label offsetLbl = new Label(lineComposite, SWT.NONE);
+               GridData gridData = new GridData();
+               gridData.widthHint = offset;
+               offsetLbl.setLayoutData(gridData);
+               addFormLabel(lineComposite, label);
+               Text txt = addFormTextField(lineComposite, text, null);
+               txt.setLayoutData(CmsSwtUtils.fillWidth());
+               return txt;
+       }
+
+       /** creates a single vertical-block composite for key:value display */
+       public static Text addFormColumn(Composite parent, Localized label, String text) {
+               return addFormColumn(parent, label.lead(), text);
+       }
+
+       /** creates a single vertical-block composite for key:value display */
+       public static Text addFormColumn(Composite parent, String label, String text) {
+               // Composite columnComposite = new Composite(parent, SWT.NONE);
+               // columnComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
+               // false));
+               // columnComposite.setLayout(new GridLayout(1, false));
+               addFormLabel(parent, label);
+               Text txt = addFormTextField(parent, text, null);
+               txt.setEditable(false);
+               txt.setLayoutData(CmsSwtUtils.fillWidth());
+               return txt;
+       }
+
+       public static Label createBoldLabel(Composite parent, Localized localized) {
+               Label label = new Label(parent, SWT.LEAD);
+               label.setText(localized.lead());
+               label.setFont(EclipseUiUtils.getBoldFont(parent));
+               label.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false));
+               return label;
+       }
+
+       /*
+        * CONTENT
+        */
+       public static String toLink(Content content) {
+               return content != null ? "#" + ContentUtils.cleanPathForUrl(content.getPath()) : null;
+       }
+
+       public static Text addFormLine(Composite parent, Localized label, Content content, QNamed property,
+                       CmsEditable cmsEditable) {
+               return addFormLine(parent, label.lead(), content, property.qName(), cmsEditable);
+       }
+
+       public static EditableText addTextLine(Composite parent, int style, Localized msg, Content content, QNamed attr,
+                       CmsEditable cmsEditable, boolean line, Predicate<String> validator) {
+               Composite parentToUse = line ? SuiteSwtUtils.addLineComposite(parent, 2) : parent;
+               SuiteSwtUtils.addFormLabel(parentToUse, msg.lead());
+               EditableText text = createFormText(parentToUse, style, msg, content, attr, cmsEditable, validator);
+               return text;
+       }
+
+       public static EditableText createFormText(Composite parent, int style, Localized msg, Content content, QNamed attr,
+                       CmsEditable cmsEditable, Predicate<String> validator) {
+               EditableText text = new EditableText(parent, style | SWT.FLAT | (cmsEditable.isEditing() ? 0 : SWT.READ_ONLY));
+               text.setMessage("-");
+               text.setLayoutData(CmsSwtUtils.fillWidth());
+               text.setStyle(SuiteStyle.simpleInput);
+               String txt = content.attr(attr);
+               if (txt == null)
+                       txt = "";
+               text.setText(txt);
+               if (cmsEditable.isEditing())
+                       text.setMouseListener(new MouseAdapter() {
+
+                               private static final long serialVersionUID = 1L;
+
+                               @Override
+                               public void mouseDoubleClick(MouseEvent e) {
+                                       String currentTxt = text.getText();
+                                       text.startEditing();
+                                       text.setText(currentTxt);
+
+                                       Runnable save = () -> {
+                                               String editedTxt = text.getText();
+                                               if (validator != null) {
+                                                       if (!validator.test(editedTxt)) {
+                                                               text.stopEditing();
+                                                               text.setText(currentTxt);
+                                                               CmsFeedback.show(editedTxt + " is not properly formatted");
+                                                               return;
+                                                               // throw new IllegalArgumentException(editedTxt + " is not properly formatted");
+                                                       }
+                                               }
+                                               content.put(attr, editedTxt);
+                                               text.stopEditing();
+                                               text.setText(editedTxt);
+                                               text.getParent().layout(new Control[] { text.getControl() });
+                                       };
+                                       ((Text) text.getControl()).addSelectionListener(new SelectionListener() {
+
+                                               private static final long serialVersionUID = 1L;
+
+                                               @Override
+                                               public void widgetSelected(SelectionEvent e) {
+                                               }
+
+                                               @Override
+                                               public void widgetDefaultSelected(SelectionEvent e) {
+                                                       save.run();
+                                               }
+                                       });
+                                       ((Text) text.getControl()).addFocusListener(new FocusListener() {
+
+                                               private static final long serialVersionUID = 333838002411959302L;
+
+                                               @Override
+                                               public void focusLost(FocusEvent event) {
+                                                       save.run();
+                                               }
+
+                                               @Override
+                                               public void focusGained(FocusEvent event) {
+                                               }
+                                       });
+
+                               }
+
+                       });
+               return text;
+       }
+
+       public static Text addFormLine(Composite parent, String label, Content content, QName property,
+                       CmsEditable cmsEditable) {
+               Composite lineComposite = SuiteSwtUtils.addLineComposite(parent, 2);
+               SuiteSwtUtils.addFormLabel(lineComposite, label);
+               String text = content.attr(property);
+               Text txt = SuiteSwtUtils.addFormTextField(lineComposite, text, null, SWT.WRAP);
+               if (cmsEditable != null && cmsEditable.isEditing()) {
+                       txt.addModifyListener((e) -> {
+                               content.put(property, txt.getText());
+                       });
+               } else {
+                       txt.setEditable(false);
+               }
+               txt.setLayoutData(CmsSwtUtils.fillWidth());
+               return txt;
+       }
+
+       public static Text addFormColumn(Composite parent, Localized label, Content content, QNamed property,
+                       CmsEditable cmsEditable) {
+               return addFormColumn(parent, label.lead(), content, property.qName(), cmsEditable);
+       }
+
+       public static Text addFormColumn(Composite parent, String label, Content content, QName property,
+                       CmsEditable cmsEditable) {
+               SuiteSwtUtils.addFormLabel(parent, label);
+               String text = content.attr(property);
+               Text txt = SuiteSwtUtils.addFormTextField(parent, text, null, 0);
+               if (cmsEditable != null && cmsEditable.isEditing()) {
+                       txt.addModifyListener((e) -> {
+                               content.put(property, txt.getText().trim());
+                       });
+               } else {
+                       txt.setEditable(false);
+               }
+               txt.setLayoutData(CmsSwtUtils.fillWidth());
+               return txt;
+       }
+
+       /*
+        * LINKS
+        */
+
+       /** Add a link to an internal content. */
+       public static Control addLink(Composite parent, String label, Content node, CmsStyle style) {
+               String target = toLink(node);
+               CmsLink link = new CmsLink(label, target, style);
+               return link.createUi(parent);
+       }
+
+       public static Control addExternalLink(Composite parent, String label, String url, String plainCssAnchorClass,
+                       boolean newWindow) {
+               Label lbl = new Label(parent, SWT.NONE);
+               CmsSwtUtils.markup(lbl);
+               StringBuilder txt = new StringBuilder();
+               txt.append("<a");
+               if (plainCssAnchorClass != null)
+                       txt.append(" class='" + plainCssAnchorClass + "'");
+               txt.append(" href='").append(url).append("'");
+               if (newWindow) {
+                       txt.append(" target='blank_'");
+               }
+               txt.append(">");
+               txt.append(label);
+               txt.append("</a>");
+               lbl.setText(txt.toString());
+               return lbl;
+       }
+
+       /*
+        * IMAGES
+        */
+
+       public static Img addPicture(Composite parent, Content file) {
+               return addPicture(parent, file, null);
+       }
+
+       public static Img addPicture(Composite parent, Content file, Integer maxWidth) {
+               return addPicture(parent, file, maxWidth, null);
+       }
+
+       public static Img addPicture(Composite parent, Content file, Integer maxWidth, Content link) {
+               // TODO optimise
+//             Integer width;
+//             Integer height;
+//             if (file.hasContentClass(EntityType.box)) {
+//                     width = file.get(SvgAttrs.width, Integer.class).get();
+//                     height = file.get(SvgAttrs.height, Integer.class).get();
+//             } else {
+//                     try (InputStream in = file.open(InputStream.class)) {
+//                             ImageData imageData = new ImageData(in);
+//                             width = imageData.width;
+//                             height = imageData.height;
+//                     } catch (IOException e) {
+//                             throw new RuntimeException(e);
+//                     }
+//             }
+//
+//             if (maxWidth != null && width > maxWidth) {
+//                     Double ratio = maxWidth.doubleValue() / width.doubleValue();
+//                     width = maxWidth;
+//                     height = (int) Math.rint(ratio * height);
+//             }
+//             Label img = new Label(parent, SWT.NONE);
+//             CmsSwtUtils.markup(img);
+//             StringBuffer txt = new StringBuffer();
+//             String target = toLink(link);
+//             if (target != null)
+//                     txt.append("<a href='").append(target).append("'>");
+//             txt.append(CmsUiUtils.img(fileNode, width.toString(), height.toString()));
+//             if (target != null)
+//                     txt.append("</a>");
+//             img.setText(txt.toString());
+//             if (parent.getLayout() instanceof GridLayout) {
+//                     GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
+//                     gd.widthHint = width.intValue();
+//                     gd.heightHint = height.intValue();
+//                     img.setLayoutData(gd);
+//             }
+
+               Img img = new Img(parent, 0, file, new Cms2DSize(maxWidth != null ? maxWidth : 0, 0));
+               if (link != null)
+                       img.setLink(link);
+
+//             String target = toLink(link);
+               if (link == null)
+                       img.addMouseListener(new MouseListener() {
+                               private static final long serialVersionUID = -1362242049325206168L;
+
+                               @Override
+                               public void mouseUp(MouseEvent e) {
+                               }
+
+                               @Override
+                               public void mouseDown(MouseEvent e) {
+                               }
+
+                               @Override
+                               public void mouseDoubleClick(MouseEvent e) {
+                                       LightweightDialog dialog = new LightweightDialog(img.getShell()) {
+
+                                               @Override
+                                               protected Control createDialogArea(Composite parent) {
+                                                       parent.setLayout(new GridLayout());
+                                                       ScrolledComposite scroll = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+                                                       scroll.setLayoutData(CmsSwtUtils.fillAll());
+                                                       scroll.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                                                       scroll.setExpandHorizontal(true);
+                                                       scroll.setExpandVertical(true);
+                                                       // scroll.setAlwaysShowScrollBars(true);
+
+                                                       Composite c = new Composite(scroll, SWT.NONE);
+                                                       scroll.setContent(c);
+                                                       c.setLayout(new GridLayout());
+                                                       c.setLayoutData(CmsSwtUtils.fillAll());
+                                                       Img bigImg = new Img(c, 0, file);
+//                                                     Label bigImg = new Label(c, SWT.NONE);
+//                                                     CmsSwtUtils.markup(bigImg);
+//                                                     bigImg.setText(CmsUiUtils.img(fileNode, Jcr.get(content, EntityNames.SVG_WIDTH),
+//                                                                     Jcr.get(content, EntityNames.SVG_HEIGHT)));
+                                                       bigImg.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+                                                       return bigImg;
+                                               }
+
+                                               @Override
+                                               protected Point getInitialSize() {
+                                                       Point shellSize = img.getShell().getSize();
+                                                       return new Point(shellSize.x - 100, shellSize.y - 100);
+                                               }
+
+                                       };
+                                       dialog.open();
+                               }
+                       });
+               img.initControl();
+               return img;
+       }
+
+       /** singleton */
+       private SuiteSwtUtils() {
+       }
+
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppLayer.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppLayer.java
new file mode 100644 (file)
index 0000000..e99d165
--- /dev/null
@@ -0,0 +1,27 @@
+package org.argeo.app.swt.ux;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.widgets.Composite;
+
+/** An UI layer for the main work area. */
+public interface SwtAppLayer extends SwtUiProvider {
+       static enum Property {
+               title, icon, weights, startMaximized, singleTab, singleTabTitle, fixedEntryArea;
+       }
+
+       String getId();
+
+       void view(SwtUiProvider uiProvider, Composite workArea, Content context);
+
+       Content getCurrentContext(Composite workArea);
+
+       default void open(SwtUiProvider uiProvider, Composite workArea, Content context) {
+               view(uiProvider, workArea, context);
+       }
+
+       default Localized getTitle() {
+               return null;
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppUi.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtAppUi.java
new file mode 100644 (file)
index 0000000..9654a8e
--- /dev/null
@@ -0,0 +1,236 @@
+package org.argeo.app.swt.ux;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.app.ux.AppUi;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtUi;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/** The view for the default UX of Argeo Suite. */
+public class SwtAppUi extends CmsSwtUi implements AppUi {
+       static enum Structural {
+               header, footer, leadPane, sidePane, loginScreen, adminLeadPane;
+       }
+
+       private static final long serialVersionUID = 6207018859086689108L;
+       private final static CmsLog log = CmsLog.getLog(SwtAppUi.class);
+
+       private Localized title;
+       private Composite header;
+       private Composite footer;
+       private Composite belowHeader;
+       private Composite leadPane;
+       private Composite sidePane;
+       private Composite dynamicArea;
+
+       private Content userDir;
+
+       private Map<String, SwtAppLayer> layers = new HashMap<>();
+       private Map<String, Composite> workAreas = new HashMap<>();
+       private String currentLayerId = null;
+
+       private boolean loginScreen = false;
+
+       public SwtAppUi(Composite parent, int style) {
+               super(parent, style);
+               this.setLayout(CmsSwtUtils.noSpaceGridLayout());
+
+               header = new Composite(this, SWT.NONE);
+               header.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               CmsSwtUtils.style(header, SuiteStyle.header);
+               header.setLayoutData(CmsSwtUtils.fillWidth());
+
+               belowHeader = new Composite(this, SWT.NONE);
+               belowHeader.setLayoutData(CmsSwtUtils.fillAll());
+
+               footer = new Composite(this, SWT.NONE);
+               footer.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               CmsSwtUtils.style(footer, SuiteStyle.footer);
+               footer.setLayoutData(CmsSwtUtils.fillWidth());
+       }
+
+       public void refreshBelowHeader(boolean initApp) {
+               CmsSwtUtils.clear(belowHeader);
+               int style = getStyle();
+               if (initApp) {
+                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+
+                       if (SWT.RIGHT_TO_LEFT == (style & SWT.RIGHT_TO_LEFT)) {// arabic, hebrew, etc.
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
+                               dynamicArea = new Composite(belowHeader, SWT.NONE);
+                               leadPane = new Composite(belowHeader, SWT.NONE);
+                       } else {
+                               leadPane = new Composite(belowHeader, SWT.NONE);
+                               dynamicArea = new Composite(belowHeader, SWT.NONE);
+                               sidePane = new Composite(belowHeader, SWT.NONE);
+                               sidePane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                               sidePane.setLayoutData(CmsSwtUtils.fillHeight());
+                       }
+                       leadPane.setLayoutData(CmsSwtUtils.fillHeight());
+                       leadPane.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                       CmsSwtUtils.style(leadPane, SuiteStyle.leadPane);
+
+                       dynamicArea.setLayoutData(CmsSwtUtils.fillAll());
+                       dynamicArea.setLayout(new FormLayout());
+
+               } else {
+                       belowHeader.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               }
+       }
+
+       /*
+        * LAYERS
+        */
+
+       public Composite getCurrentWorkArea() {
+               if (currentLayerId == null)
+                       throw new IllegalStateException("No current layer");
+               return workAreas.get(currentLayerId);
+       }
+
+       public String getCurrentLayerId() {
+               return currentLayerId;
+       }
+
+       private Composite getLayer(String id, Content context) {
+               if (!layers.containsKey(id))
+                       return null;
+               if (!workAreas.containsKey(id))
+                       initLayer(id, layers.get(id), context);
+               return workAreas.get(id);
+       }
+
+       public Composite switchToLayer(String layerId, Content context) {
+               Composite current = null;
+               if (currentLayerId != null) {
+                       current = getCurrentWorkArea();
+                       if (currentLayerId.equals(layerId))
+                               return current;
+               }
+               if (context == null) {
+                       if (!getCmsView().isAnonymous())
+                               context = getUserDir();
+               }
+               Composite toShow = getLayer(layerId, context);
+               if (toShow != null) {
+                       currentLayerId = layerId;
+                       if (!isDisposed()) {
+                               if (!toShow.isDisposed()) {
+                                       toShow.moveAbove(null);
+                               } else {
+                                       log.warn("Cannot show work area because it is disposed.");
+                                       toShow = initLayer(layerId, layers.get(layerId), context);
+                                       toShow.moveAbove(null);
+                               }
+                               dynamicArea.layout(true, true);
+                       }
+                       return toShow;
+               } else {
+                       return current;
+               }
+       }
+
+       public void switchToLayer(SwtAppLayer layer, Content context) {
+               // TODO make it more robust
+               for (String layerId : layers.keySet()) {
+                       SwtAppLayer l = layers.get(layerId);
+                       if (layer.getId().equals(l.getId())) {
+                               switchToLayer(layerId, context);
+                               return;
+                       }
+               }
+               throw new IllegalArgumentException("Layer is not registered.");
+       }
+
+       public void addLayer(String id, SwtAppLayer layer) {
+               if (!id.equals(layer.getId())) {
+                       log.error("Layer id as key '" + id + "' is not consistent with layer id '" + layer.getId()
+                                       + "', ignoring...");
+                       return;
+               }
+               layers.put(id, layer);
+       }
+
+       public void removeLayer(String id) {
+               layers.remove(id);
+               if (workAreas.containsKey(id)) {
+                       Composite workArea = workAreas.remove(id);
+                       if (!workArea.isDisposed())
+                               workArea.dispose();
+               }
+       }
+
+       protected Composite initLayer(String id, SwtAppLayer layer, Content context) {
+               Composite workArea = getCmsView().doAs(() -> (Composite) layer.createUiPart(dynamicArea, context));
+               CmsSwtUtils.style(workArea, SuiteStyle.workArea);
+               workArea.setLayoutData(CmsSwtUtils.coverAll());
+               workAreas.put(id, workArea);
+               return workArea;
+       }
+
+       public synchronized void logout() {
+               userDir = null;
+               currentLayerId = null;
+               workAreas.clear();
+       }
+
+       /*
+        * GETTERS / SETTERS
+        */
+
+       public Composite getHeader() {
+               return header;
+       }
+
+       public Composite getFooter() {
+               return footer;
+       }
+
+       public Composite getLeadPane() {
+               return leadPane;
+       }
+
+       public Composite getSidePane() {
+               return sidePane;
+       }
+
+       public Composite getBelowHeader() {
+               return belowHeader;
+       }
+
+       public Content getUserDir() {
+               return userDir;
+       }
+
+       public void setUserDir(Content userDir) {
+               this.userDir = userDir;
+       }
+
+//     @Override
+       public Localized getTitle() {
+               return title;
+       }
+
+       public void setTitle(Localized title) {
+               this.title = title;
+       }
+
+       @Override
+       public boolean isLoginScreen() {
+               return loginScreen;
+       }
+
+       public void setLoginScreen(boolean loginScreen) {
+               this.loginScreen = loginScreen;
+       }
+}
diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java
new file mode 100644 (file)
index 0000000..d123aa0
--- /dev/null
@@ -0,0 +1,680 @@
+package org.argeo.app.swt.ux;
+
+import static org.argeo.api.cms.ux.CmsView.CMS_VIEW_UID_PROPERTY;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.TreeMap;
+
+import javax.xml.namespace.QName;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentRepository;
+import org.argeo.api.acr.spi.ProvidedSession;
+import org.argeo.api.app.AppUserState;
+import org.argeo.api.app.EntityConstants;
+import org.argeo.api.app.EntityName;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.app.RankedObject;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.CmsEvent;
+import org.argeo.api.cms.CmsEventSubscriber;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.api.cms.ux.CmsTheme;
+import org.argeo.api.cms.ux.CmsUi;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ux.AbstractArgeoApp;
+import org.argeo.app.ux.AppUi;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.LocaleUtils;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.util.LangUtils;
+import org.argeo.cms.ux.CmsUxUtils;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.widgets.Composite;
+import org.osgi.framework.Constants;
+
+/** The Argeo Suite App. */
+public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber {
+       private final static CmsLog log = CmsLog.getLog(SwtArgeoApp.class);
+
+       public final static String PUBLIC_BASE_PATH_PROPERTY = "publicBasePath";
+       public final static String DEFAULT_UI_NAME_PROPERTY = "defaultUiName";
+       public final static String DEFAULT_THEME_ID_PROPERTY = "defaultThemeId";
+       public final static String DEFAULT_LAYER_PROPERTY = "defaultLayer";
+       public final static String SHARED_PID_PREFIX_PROPERTY = "sharedPidPrefix";
+
+       private final static String LOGIN = "login";
+       private final static String HOME_STATE = "~";
+
+       private String publicBasePath = null;
+
+       private String appPid;
+       private String pidPrefix;
+       private String sharedPidPrefix;
+
+//     private String headerPid;
+//     private String footerPid;
+//     private String leadPanePid;
+//     private String adminLeadPanePid;
+//     private String loginScreenPid;
+
+       private String defaultUiName = "app";
+       private String adminUiName = "admin";
+
+       // FIXME such default names make refactoring more dangerous
+       @Deprecated
+       private String defaultLayerPid = "argeo.suite.ui.dashboardLayer";
+       @Deprecated
+       private String defaultThemeId = "org.argeo.app.theme.default";
+
+       // TODO use QName as key for byType
+       private Map<String, RankedObject<SwtUiProvider>> uiProvidersByPid = Collections.synchronizedMap(new HashMap<>());
+       private Map<String, RankedObject<SwtUiProvider>> uiProvidersByType = Collections.synchronizedMap(new HashMap<>());
+       private Map<String, RankedObject<SwtAppLayer>> layersByPid = Collections.synchronizedSortedMap(new TreeMap<>());
+       private Map<String, RankedObject<SwtAppLayer>> layersByType = Collections.synchronizedSortedMap(new TreeMap<>());
+
+//     private CmsUserManager cmsUserManager;
+
+       // TODO make more optimal or via CmsSession/CmsView
+       private static Timer janitorTimer = new Timer(true);
+       private Map<String, WeakReference<SwtAppUi>> managedUis = new HashMap<>();
+
+       // ACR
+       private ContentRepository contentRepository;
+       private AppUserState appUserState;
+       // JCR
+//     private Repository repository;
+
+       public void start(Map<String, Object> properties) {
+               for (SuiteUxEvent event : SuiteUxEvent.values()) {
+                       getCmsContext().getCmsEventBus().addEventSubscriber(event.topic(), this);
+               }
+
+               if (properties.containsKey(DEFAULT_UI_NAME_PROPERTY))
+                       defaultUiName = LangUtils.get(properties, DEFAULT_UI_NAME_PROPERTY);
+               if (properties.containsKey(DEFAULT_THEME_ID_PROPERTY))
+                       defaultThemeId = LangUtils.get(properties, DEFAULT_THEME_ID_PROPERTY);
+               if (properties.containsKey(DEFAULT_LAYER_PROPERTY))
+                       defaultLayerPid = LangUtils.get(properties, DEFAULT_LAYER_PROPERTY);
+               sharedPidPrefix = LangUtils.get(properties, SHARED_PID_PREFIX_PROPERTY);
+               publicBasePath = LangUtils.get(properties, PUBLIC_BASE_PATH_PROPERTY);
+
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       appPid = properties.get(Constants.SERVICE_PID).toString();
+                       int lastDotIndex = appPid.lastIndexOf('.');
+                       if (lastDotIndex >= 0) {
+                               pidPrefix = appPid.substring(0, lastDotIndex);
+                       }
+               } else {
+                       // TODO does it make sense to accept that?
+                       appPid = "<unknown>";
+               }
+               Objects.requireNonNull(contentRepository, "Content repository must be provided");
+               Objects.requireNonNull(appUserState, "App user state must be provided");
+
+               long janitorPeriod = 60 * 60 * 1000;// 1h
+               // long janitorPeriod = 60 * 1000;// min
+               janitorTimer.schedule(new TimerTask() {
+
+                       @Override
+                       public void run() {
+                               try {
+                                       // copy Map in order to avoid concurrent modification exception
+                                       Iterator<Map.Entry<String, WeakReference<SwtAppUi>>> uiRefs = new HashMap<>(managedUis).entrySet()
+                                                       .iterator();
+                                       refs: while (uiRefs.hasNext()) {
+                                               Map.Entry<String, WeakReference<SwtAppUi>> entry = uiRefs.next();
+                                               String uiUuid = entry.getKey();
+                                               WeakReference<SwtAppUi> uiRef = entry.getValue();
+                                               SwtAppUi ui = uiRef.get();
+                                               if (ui == null) {
+                                                       if (log.isTraceEnabled())
+                                                               log.warn("Unreferenced UI " + uiUuid + " in " + appPid + ", removing it");
+                                                       managedUis.remove(uiUuid);
+                                                       continue refs;
+                                               }
+                                               if (!ui.isDisposed() && !ui.getDisplay().isDisposed()) {
+                                                       if (ui.isTimedOut()) {
+                                                               if (log.isTraceEnabled())
+                                                                       log.trace("Killing timed-out UI " + uiUuid + " in " + appPid);
+                                                               UiContext.killDisplay(ui.getDisplay());
+                                                       }
+                                               } else {
+                                                       if (log.isTraceEnabled())
+                                                               log.warn("Disposed UI " + uiUuid + " still referenced in " + appPid + ", removing it");
+                                                       managedUis.remove(uiUuid);
+                                               }
+                                       }
+                                       if (log.isTraceEnabled())
+                                               log.trace(managedUis.size() + " UIs being managed by app " + appPid);
+                               } catch (Exception e) {
+                                       log.error("Could not clean up timed-out UIs", e);
+                               }
+                       }
+               }, janitorPeriod, janitorPeriod);
+
+               if (log.isDebugEnabled())
+                       log.info("Argeo Suite App " + appPid + " started");
+       }
+
+       public void stop(Map<String, Object> properties) {
+               refs: for (WeakReference<SwtAppUi> uiRef : managedUis.values()) {
+                       SwtAppUi ui = uiRef.get();
+                       if (ui == null)
+                               continue refs;
+                       if (!ui.isDisposed() && !ui.getDisplay().isDisposed()) {
+                               ui.getDisplay().syncExec(() -> ui.dispose());
+                       }
+               }
+               managedUis.clear();
+               if (log.isDebugEnabled())
+                       log.info("Argeo Suite App stopped");
+
+       }
+
+       @Override
+       public Set<String> getUiNames() {
+               HashSet<String> uiNames = new HashSet<>();
+               uiNames.add(defaultUiName);
+               uiNames.add(adminUiName);
+               return uiNames;
+       }
+
+       @Override
+       public CmsUi initUi(Object parent) {
+               Composite uiParent = (Composite) parent;
+               String uiName = uiParent.getData(UI_NAME_PROPERTY) != null ? uiParent.getData(UI_NAME_PROPERTY).toString()
+                               : null;
+               CmsView cmsView = CmsSwtUtils.getCmsView(uiParent);
+               if (cmsView == null)
+                       throw new IllegalStateException("No CMS view is registered.");
+               CmsTheme theme = getTheme(uiName);
+               if (theme != null)
+                       CmsSwtUtils.registerCmsTheme(uiParent.getShell(), theme);
+               SwtAppUi argeoSuiteUi = new SwtAppUi(uiParent, SWT.INHERIT_DEFAULT);
+               // TODO make timeout configurable
+               argeoSuiteUi.setUiTimeout(6 * 60 * 60 * 1000);// 6 hours
+               // argeoSuiteUi.setUiTimeout(60 * 1000);// 1 min
+               String uid = cmsView.getUid();
+               argeoSuiteUi.addDisposeListener(new CleanUpUi(uid));
+               managedUis.put(uid, new WeakReference<>(argeoSuiteUi));
+               return argeoSuiteUi;
+       }
+
+       @Override
+       public String getThemeId(String uiName) {
+               String themeId = System.getProperty("org.argeo.app.theme.default");
+               if (themeId != null)
+                       return themeId;
+               return defaultThemeId;
+       }
+
+       @Override
+       public void refreshUi(CmsUi cmsUi, String state) {
+               try {
+                       Content context = null;
+                       SwtAppUi ui = (SwtAppUi) cmsUi;
+                       ui.updateLastAccess();
+
+                       String uiName = Objects.toString(ui.getParent().getData(UI_NAME_PROPERTY), null);
+                       if (uiName == null)
+                               throw new IllegalStateException("UI name should not be null");
+                       CmsView cmsView = CmsSwtUtils.getCmsView(ui);
+
+                       ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository, cmsView);
+
+                       SwtUiProvider headerUiProvider = findStructuralUiProvider(SwtAppUi.Structural.header.name());
+                       SwtUiProvider footerUiProvider = findStructuralUiProvider(SwtAppUi.Structural.footer.name());
+                       SwtUiProvider leadPaneUiProvider;
+                       if (adminUiName.equals(uiName)) {
+                               leadPaneUiProvider = findStructuralUiProvider(SwtAppUi.Structural.adminLeadPane.name());
+                       } else {
+                               leadPaneUiProvider = findStructuralUiProvider(SwtAppUi.Structural.leadPane.name());
+                       }
+
+                       Localized appTitle = null;
+                       if (headerUiProvider instanceof DefaultHeader) {
+                               appTitle = ((DefaultHeader) headerUiProvider).getTitle();
+                       }
+                       ui.setTitle(appTitle);
+
+                       if (cmsView.isAnonymous() && publicBasePath == null) {// internal app, must login
+                               ui.logout();
+                               ui.setLoginScreen(true);
+                               if (headerUiProvider != null)
+                                       refreshPart(headerUiProvider, ui.getHeader(), context);
+                               ui.refreshBelowHeader(false);
+                               SwtUiProvider loginScreenUiProvider = findStructuralUiProvider(SwtAppUi.Structural.loginScreen.name());
+                               refreshPart(loginScreenUiProvider, ui.getBelowHeader(), context);
+                               if (footerUiProvider != null)
+                                       refreshPart(footerUiProvider, ui.getFooter(), context);
+                               ui.layout(true, true);
+                               setState(ui, LOGIN);
+                       } else {
+                               if (LOGIN.equals(state))
+                                       state = null;
+                               if (ui.isLoginScreen()) {
+                                       ui.setLoginScreen(false);
+                               }
+                               CmsSession cmsSession = cmsView.getCmsSession();
+                               if (ui.getUserDir() == null) {
+                                       // FIXME NPE on CMSSession when logging in from anonymous
+                                       if (cmsSession == null || cmsView.isAnonymous()) {
+                                               assert publicBasePath != null;
+                                               Content userDir = contentSession
+                                                               .get(Content.ROOT_PATH + CmsConstants.SYS_WORKSPACE + publicBasePath);
+                                               ui.setUserDir(userDir);
+                                       } else {
+                                               Content userDir = appUserState.getOrCreateSessionDir(cmsSession);
+                                               ui.setUserDir(userDir);
+//                                             Node userDirNode = jcrContentProvider.doInAdminSession((adminSession) -> {
+//                                                     Node node = SuiteUtils.getOrCreateCmsSessionNode(adminSession, cmsSession);
+//                                                     return node;
+//                                             });
+//                                             Content userDir = contentSession
+//                                                             .get(ContentUtils.SLASH + CmsConstants.SYS_WORKSPACE + userDirNode.getPath());
+//                                             ui.setUserDir(userDir);
+                                       }
+                               }
+                               initLocale(cmsSession);
+                               context = stateToNode(ui, state);
+                               if (context == null)
+                                       context = ui.getUserDir();
+
+                               if (headerUiProvider != null)
+                                       refreshPart(headerUiProvider, ui.getHeader(), context);
+                               ui.refreshBelowHeader(true);
+                               for (String key : layersByPid.keySet()) {
+                                       SwtAppLayer layer = layersByPid.get(key).get();
+                                       ui.addLayer(key, layer);
+                               }
+
+                               if (leadPaneUiProvider != null)
+                                       refreshPart(leadPaneUiProvider, ui.getLeadPane(), context);
+                               if (footerUiProvider != null)
+                                       refreshPart(footerUiProvider, ui.getFooter(), context);
+                               ui.layout(true, true);
+                               setState(ui, state != null ? state : defaultLayerPid);
+                       }
+               } catch (Exception e) {
+                       CmsFeedback.error("Unexpected exception", e);
+               }
+       }
+
+       private void initLocale(CmsSession cmsSession) {
+               if (cmsSession == null)
+                       return;
+               Locale locale = cmsSession.getLocale();
+               UiContext.setLocale(locale);
+               LocaleUtils.setThreadLocale(locale);
+
+       }
+
+       private void refreshPart(SwtUiProvider uiProvider, Composite part, Content context) {
+               CmsSwtUtils.clear(part);
+               uiProvider.createUiPart(part, context);
+       }
+
+       private SwtUiProvider findStructuralUiProvider(String suffix) {
+               SwtUiProvider res = null;
+               if (pidPrefix != null)
+                       res = findUiProvider(pidPrefix + "." + suffix);
+               if (res != null)
+                       return res;
+               if (sharedPidPrefix != null)
+                       res = findUiProvider(sharedPidPrefix + "." + suffix);
+               return res;
+       }
+
+       private SwtUiProvider findUiProvider(String pid) {
+               if (!uiProvidersByPid.containsKey(pid))
+                       return null;
+               return uiProvidersByPid.get(pid).get();
+       }
+
+       private SwtAppLayer findLayer(String pid) {
+               if (!layersByPid.containsKey(pid))
+                       return null;
+               return layersByPid.get(pid).get();
+       }
+
+       private List<String> listTypes(Map<String, ? extends Object> byType, Content content) {
+               if (content == null)
+                       throw new IllegalArgumentException("A content should be provided");
+               List<String> types = new ArrayList<>();
+               if (content.hasContentClass(EntityType.entity.qName())) {
+                       String type = content.attr(EntityName.type.qName());
+                       if (type != null && byType.containsKey(type))
+                               types.add(type);
+               }
+
+               List<QName> objectClasses = content.getContentClasses();
+               for (QName cc : objectClasses) {
+                       String type = cc.getPrefix() + ":" + cc.getLocalPart();
+                       if (byType.containsKey(type))
+                               types.add(type);
+               }
+               if (types.isEmpty())
+                       throw new IllegalArgumentException("No type found for " + content + " (" + objectClasses + ")");
+               return types;
+       }
+
+       private RankedObject<SwtAppLayer> findLayerByType(Content content) {
+               List<String> types = listTypes(layersByType, content);
+               // we assume the types will be ordered by priority
+               // (no possible for LDAP at this stage)
+               for (String type : types) {
+                       if (layersByType.containsKey(type))
+                               return layersByType.get(type);
+               }
+               throw new IllegalArgumentException("No layer found for " + content + " with type " + types);
+       }
+
+       private RankedObject<SwtUiProvider> findUiProviderByType(Content content) {
+               RankedObject<SwtAppLayer> layerRO = findLayerByType(content);
+               List<String> layerTypes = LangUtils.toStringList(layerRO.getProperties().get(EntityConstants.TYPE));
+               List<String> types = listTypes(uiProvidersByType, content);
+               // layer types are ordered by priority
+               for (String type : layerTypes) {
+                       if (types.contains(type) && uiProvidersByType.containsKey(type))
+                               return uiProvidersByType.get(type);
+               }
+               throw new IllegalArgumentException("No UI provider found for " + content + " with types " + types);
+       }
+
+       @Override
+       public void setState(CmsUi cmsUi, String state) {
+               AppUi ui = (AppUi) cmsUi;
+               if (state == null)
+                       return;
+               if (!state.startsWith("/")) {
+                       if (LOGIN.equals(state)) {
+                               String appTitle = "";
+                               if (ui.getTitle() != null)
+                                       appTitle = ui.getTitle().lead();
+                               ui.getCmsView().stateChanged(state, appTitle);
+                               return;
+                       }
+                       Map<String, Object> properties = new HashMap<>();
+                       String layerId = HOME_STATE.equals(state) ? defaultLayerPid : state;
+                       properties.put(SuiteUxEvent.LAYER, layerId);
+                       properties.put(SuiteUxEvent.CONTENT_PATH, HOME_STATE);
+                       ui.getCmsView().sendEvent(SuiteUxEvent.switchLayer.topic(), properties);
+                       return;
+               }
+               if (ui.isLoginScreen()) {
+                       return;
+               }
+
+               Content node = stateToNode(ui, state);
+               if (node == null) {
+                       ui.getCmsView().navigateTo(HOME_STATE);
+               } else {
+                       ui.getCmsView().sendEvent(SuiteUxEvent.switchLayer.topic(), SuiteUxEvent.eventProperties(node));
+                       ui.getCmsView().sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(node));
+               }
+       }
+
+       // TODO move it to an internal package?
+       private static String nodeToState(Content node) {
+               return node.getPath();
+       }
+
+       private Content stateToNode(CmsUi suiteUi, String state) {
+               if (suiteUi == null)
+                       return null;
+               if (state == null || !state.startsWith("/"))
+                       return null;
+
+               String path = state;
+
+               ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository,
+                               suiteUi.getCmsView());
+               return contentSession.get(path);
+       }
+
+       /*
+        * Events management
+        */
+
+       @Override
+       public void onEvent(String topic, Map<String, Object> event) {
+
+               // Specific UI related events
+               SwtAppUi ui = getRelatedUi(event);
+               if (ui == null)
+                       return;
+               ui.updateLastAccess();
+               ui.getCmsView().runAs(() -> {
+                       try {
+                               String appTitle = "";
+                               if (ui.getTitle() != null)
+                                       appTitle = ui.getTitle().lead();
+
+                               if (isTopic(topic, SuiteUxEvent.refreshPart)) {
+                                       Content content = getContentFromEvent(ui, event);
+                                       if (content == null)
+                                               return;
+                                       SwtUiProvider uiProvider = findUiProviderByType(content).get();
+                                       SwtAppLayer layer = findLayerByType(content).get();
+                                       ui.switchToLayer(layer, content);
+                                       layer.view(uiProvider, ui.getCurrentWorkArea(), content);
+                                       ui.getCmsView().stateChanged(nodeToState(content),
+                                                       stateTitle(appTitle, CmsUxUtils.getTitle(content)));
+                               } else if (isTopic(topic, SuiteUxEvent.openNewPart)) {
+                                       Content content = getContentFromEvent(ui, event);
+                                       if (content == null)
+                                               return;
+                                       SwtUiProvider uiProvider = findUiProviderByType(content).get();
+                                       SwtAppLayer layer = findLayerByType(content).get();
+                                       ui.switchToLayer(layer, content);
+                                       layer.open(uiProvider, ui.getCurrentWorkArea(), content);
+                                       ui.getCmsView().stateChanged(nodeToState(content),
+                                                       stateTitle(appTitle, CmsUxUtils.getTitle(content)));
+                               } else if (isTopic(topic, SuiteUxEvent.switchLayer)) {
+                                       String layerId = get(event, SuiteUxEvent.LAYER);
+                                       if (layerId != null && !"".equals(layerId.trim())) {
+                                               SwtAppLayer suiteLayer = findLayer(layerId);
+                                               if (suiteLayer == null)
+                                                       throw new IllegalArgumentException("No layer '" + layerId + "' available.");
+                                               Localized layerTitle = suiteLayer.getTitle();
+                                               // FIXME make sure we don't rebuild the work area twice
+                                               Composite workArea = ui.switchToLayer(layerId, ui.getUserDir());
+                                               String title = null;
+                                               if (layerTitle != null)
+                                                       title = layerTitle.lead();
+                                               Content nodeFromState = getContentFromEvent(ui, event);
+                                               if (nodeFromState != null && nodeFromState.getPath().equals(ui.getUserDir().getPath())) {
+                                                       // default layer view is forced
+                                                       String state = defaultLayerPid.equals(layerId) ? "~" : layerId;
+                                                       ui.getCmsView().stateChanged(state, stateTitle(appTitle, title));
+                                                       suiteLayer.view(null, workArea, nodeFromState);
+                                               } else {
+                                                       Content layerCurrentContext = suiteLayer.getCurrentContext(workArea);
+                                                       if (layerCurrentContext != null && !layerCurrentContext.equals(ui.getUserDir())) {
+                                                               // layer was already showing a context so we set the state to it
+                                                               ui.getCmsView().stateChanged(nodeToState(layerCurrentContext),
+                                                                               stateTitle(appTitle, CmsUxUtils.getTitle(layerCurrentContext)));
+                                                       } else {
+                                                               // no context was shown
+                                                               ui.getCmsView().stateChanged(layerId, stateTitle(appTitle, title));
+                                                       }
+                                               }
+                                       } else {
+                                               Content content = getContentFromEvent(ui, event);
+                                               if (content != null) {
+                                                       SwtAppLayer layer = findLayerByType(content).get();
+                                                       ui.switchToLayer(layer, content);
+                                               }
+                                       }
+                               }
+                       } catch (Exception e) {
+                               CmsFeedback.error("Cannot handle event " + topic + " " + event, e);
+//                             log.error("Cannot handle event " + event, e);
+                       }
+               });
+       }
+
+       private String stateTitle(String appTitle, String additionalTitle) {
+               return additionalTitle == null ? appTitle : appTitle + " - " + additionalTitle;
+       }
+
+       private boolean isTopic(String topic, CmsEvent cmsEvent) {
+               Objects.requireNonNull(topic);
+               return topic.equals(cmsEvent.topic());
+       }
+
+       protected Content getContentFromEvent(SwtAppUi ui, Map<String, Object> event) {
+               ProvidedSession contentSession = (ProvidedSession) CmsUxUtils.getContentSession(contentRepository,
+                               ui.getCmsView());
+
+               String path = get(event, SuiteUxEvent.CONTENT_PATH);
+
+               if (path != null && (path.equals(HOME_STATE) || path.equals("")))
+                       return ui.getUserDir();
+               Content node;
+               if (path == null) {
+                       return null;
+               } else {
+                       node = contentSession.get(path);
+               }
+               return node;
+       }
+
+       private SwtAppUi getRelatedUi(Map<String, Object> eventProperties) {
+               WeakReference<SwtAppUi> uiRef = managedUis.get(get(eventProperties, CMS_VIEW_UID_PROPERTY));
+               if (uiRef == null)
+                       return null;
+               return uiRef.get();
+       }
+
+       public static String get(Map<String, Object> eventProperties, String key) {
+               Object value = eventProperties.get(key);
+               if (value == null)
+                       return null;
+               return value.toString();
+
+       }
+
+       /*
+        * Dependency injection.
+        */
+
+       public void addUiProvider(SwtUiProvider uiProvider, Map<String, Object> properties) {
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       String pid = (String) properties.get(Constants.SERVICE_PID);
+                       RankedObject.putIfHigherRank(uiProvidersByPid, pid, uiProvider, properties);
+               }
+               if (properties.containsKey(EntityConstants.TYPE)) {
+                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
+                       for (String type : types) {
+                               RankedObject.putIfHigherRank(uiProvidersByType, type, uiProvider, properties);
+                       }
+               }
+       }
+
+       public void removeUiProvider(SwtUiProvider uiProvider, Map<String, Object> properties) {
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       String pid = (String) properties.get(Constants.SERVICE_PID);
+                       if (uiProvidersByPid.containsKey(pid)) {
+                               if (uiProvidersByPid.get(pid).equals(new RankedObject<SwtUiProvider>(uiProvider, properties))) {
+                                       uiProvidersByPid.remove(pid);
+                               }
+                       }
+               }
+               if (properties.containsKey(EntityConstants.TYPE)) {
+                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
+                       for (String type : types) {
+                               if (uiProvidersByType.containsKey(type)) {
+                                       if (uiProvidersByType.get(type).equals(new RankedObject<SwtUiProvider>(uiProvider, properties))) {
+                                               uiProvidersByType.remove(type);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       public void addLayer(SwtAppLayer layer, Map<String, Object> properties) {
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       String pid = (String) properties.get(Constants.SERVICE_PID);
+                       RankedObject.putIfHigherRank(layersByPid, pid, layer, properties);
+               }
+               if (properties.containsKey(EntityConstants.TYPE)) {
+                       // TODO check consistency of entity types with overridden ?
+                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
+                       for (String type : types)
+                               RankedObject.putIfHigherRank(layersByType, type, layer, properties);
+               }
+       }
+
+       public void removeLayer(SwtAppLayer layer, Map<String, Object> properties) {
+               if (properties.containsKey(Constants.SERVICE_PID)) {
+                       String pid = (String) properties.get(Constants.SERVICE_PID);
+                       if (layersByPid.containsKey(pid)) {
+                               if (layersByPid.get(pid).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
+                                       layersByPid.remove(pid);
+                               }
+                       }
+               }
+               if (properties.containsKey(EntityConstants.TYPE)) {
+                       List<String> types = LangUtils.toStringList(properties.get(EntityConstants.TYPE));
+                       for (String type : types) {
+                               if (layersByType.containsKey(type)) {
+                                       if (layersByType.get(type).equals(new RankedObject<SwtAppLayer>(layer, properties))) {
+                                               layersByType.remove(type);
+                                       }
+                               }
+                       }
+               }
+       }
+
+       public void setContentRepository(ContentRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+
+       public void setAppUserState(AppUserState appUserState) {
+               this.appUserState = appUserState;
+       }
+
+       /**
+        * Dedicated class to clean up the UI in order to avoid illegal access issues
+        * with lambdas.
+        */
+       private class CleanUpUi implements DisposeListener {
+               private static final long serialVersionUID = 1905900302262082463L;
+               final String uid;
+
+               public CleanUpUi(String uid) {
+                       this.uid = uid;
+               }
+
+               @Override
+               public void widgetDisposed(DisposeEvent e) {
+                       managedUis.remove(uid);
+                       if (log.isDebugEnabled())
+                               log.debug("App " + appPid + " - Suite UI " + uid + " has been disposed (" + managedUis.size()
+                                               + " UIs still being managed).");
+               }
+
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/.classpath b/swt/org.argeo.app.ui/.classpath
new file mode 100644 (file)
index 0000000..81fe078
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/swt/org.argeo.app.ui/.gitignore b/swt/org.argeo.app.ui/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/swt/org.argeo.app.ui/.project b/swt/org.argeo.app.ui/.project
new file mode 100644 (file)
index 0000000..a7893bd
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.app.ui</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/swt/org.argeo.app.ui/META-INF/.gitignore b/swt/org.argeo.app.ui/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/swt/org.argeo.app.ui/OSGI-INF/adminLeadPane.xml b/swt/org.argeo.app.ui/OSGI-INF/adminLeadPane.xml
new file mode 100644 (file)
index 0000000..db87157
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Admin Lead Pane">
+   <implementation class="org.argeo.app.swt.ux.DefaultLeadPane"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <properties entry="config/adminLeadPane.properties"/>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <property name="defaultLayers" type="String">argeo.suite.ui.termsLayer
+   </property>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml b/swt/org.argeo.app.ui/OSGI-INF/cmsApp.xml
new file mode 100644 (file)
index 0000000..2c299a3
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="start" deactivate="stop" name="Argeo Suite App">
+   <implementation class="org.argeo.app.swt.ux.SwtArgeoApp"/>
+   <service>
+      <provide interface="org.argeo.api.cms.CmsApp"/>
+   </service>
+   <properties entry="config/cmsApp.properties"/>
+   <reference bind="addUiProvider" cardinality="0..n" interface="org.argeo.cms.swt.acr.SwtUiProvider" policy="dynamic" unbind="removeUiProvider"/>
+   <reference bind="addTheme" cardinality="1..n" interface="org.argeo.api.cms.ux.CmsTheme" name="CmsTheme" policy="dynamic" unbind="removeTheme"/>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+   <reference bind="setCmsContext" cardinality="1..1" interface="org.argeo.api.cms.CmsContext" name="CmsContext" policy="static"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.ContentRepository" name="ContentRepository" policy="static"/>
+   <reference bind="setAppUserState" cardinality="1..1" interface="org.argeo.api.app.AppUserState" name="AppUserState" policy="static"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml b/swt/org.argeo.app.ui/OSGI-INF/contentEntryArea.xml
new file mode 100644 (file)
index 0000000..d8579b0
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.library.ContentEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/contentEntryArea.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/contentLayer.xml b/swt/org.argeo.app.ui/OSGI-INF/contentLayer.xml
new file mode 100644 (file)
index 0000000..37622b8
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Content Layer">
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
+   <service>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
+   </service>
+   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" policy="dynamic" target="(service.pid=argeo.library.ui.contentEntryArea)"/>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/contentLayer.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/dashboard.xml b/swt/org.argeo.app.ui/OSGI-INF/dashboard.xml
new file mode 100644 (file)
index 0000000..8ee65b3
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Default Dashboard">
+   <implementation class="org.argeo.app.ui.DefaultDashboard"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/dashboard.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml b/swt/org.argeo.app.ui/OSGI-INF/dashboardLayer.xml
new file mode 100644 (file)
index 0000000..1ed1f1c
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Dashboard Layer">
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
+   <service>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/dashboardLayer.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/defaultMap.xml b/swt/org.argeo.app.ui/OSGI-INF/defaultMap.xml
new file mode 100644 (file)
index 0000000..8d53c27
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.geo.swt.MapUiProvider"/>
+   <properties entry="config/defaultMap.properties"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/documentUiProvider.xml b/swt/org.argeo.app.ui/OSGI-INF/documentUiProvider.xml
new file mode 100644 (file)
index 0000000..97cb529
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.publish.DocumentUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/documentUiProvider.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/documentsFolder.xml b/swt/org.argeo.app.ui/OSGI-INF/documentsFolder.xml
new file mode 100644 (file)
index 0000000..f1dc0fd
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Documents Folder">
+   <implementation class="org.argeo.app.ui.library.DocumentsFolderUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/documentsFolder.properties"/>
+   <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/eventRecorder.xml b/swt/org.argeo.app.ui/OSGI-INF/eventRecorder.xml
new file mode 100644 (file)
index 0000000..ab1a6ae
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Event Recorder">
+   <implementation class="org.argeo.app.ui.EventRecorder"/>
+   <service>
+      <provide interface="org.osgi.service.event.EventHandler"/>
+   </service>
+   <properties entry="config/eventRecorder.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/footer.xml b/swt/org.argeo.app.ui/OSGI-INF/footer.xml
new file mode 100644 (file)
index 0000000..ded75df
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Footer">
+   <implementation class="org.argeo.app.swt.ux.DefaultFooter"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/footer.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/fsEntryArea.xml b/swt/org.argeo.app.ui/OSGI-INF/fsEntryArea.xml
new file mode 100644 (file)
index 0000000..beb8cf2
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.library.DocumentsTreeUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/fsEntryArea.properties"/>
+   <reference bind="setNodeFileSystemProvider" cardinality="1..1" interface="java.nio.file.spi.FileSystemProvider" name="FileSystemProvider" policy="dynamic" target="(service.pid=org.argeo.api.fsProvider)"/>
+   <reference bind="setRepository" cardinality="1..1" interface="javax.jcr.Repository" name="Repository" policy="static" target="(cn=ego)"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/groupUiProvider.xml b/swt/org.argeo.app.ui/OSGI-INF/groupUiProvider.xml
new file mode 100644 (file)
index 0000000..64eb06f
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.people.GroupUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/groupUiProvider.properties"/>
+   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.api.cms.directory.CmsUserManager" name="CmsUserManager" policy="static"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/header.xml b/swt/org.argeo.app.ui/OSGI-INF/header.xml
new file mode 100644 (file)
index 0000000..e6713ed
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Suite Header">
+   <implementation class="org.argeo.app.swt.ux.DefaultHeader"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/header.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/hierarchyUnitUiProvider.xml b/swt/org.argeo.app.ui/OSGI-INF/hierarchyUnitUiProvider.xml
new file mode 100644 (file)
index 0000000..1a8b347
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.people.HierarchyUnitUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/hierarchyUnitUiProvider.properties"/>
+   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.api.cms.directory.CmsUserManager" name="CmsUserManager" policy="static"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties b/swt/org.argeo.app.ui/OSGI-INF/l10n/bundle.properties
new file mode 100644 (file)
index 0000000..afa3f49
--- /dev/null
@@ -0,0 +1,3 @@
+appTitle=Argeo Suite
+
+people=People
diff --git a/swt/org.argeo.app.ui/OSGI-INF/leadPane.xml b/swt/org.argeo.app.ui/OSGI-INF/leadPane.xml
new file mode 100644 (file)
index 0000000..9c0df65
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" immediate="false" name="Default Lead Pane">
+   <implementation class="org.argeo.app.swt.ux.DefaultLeadPane"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/leadPane.properties"/>
+   <property name="defaultLayers" type="String">argeo.suite.ui.dashboardLayer
+argeo.library.ui.contentLayer
+argeo.product.knowledge.structureLayer
+argeo.people.ui.peopleLayer
+argeo.geo.ui.mapLayer
+   </property>
+   <reference bind="addLayer" cardinality="1..n" interface="org.argeo.app.swt.ux.SwtAppLayer" name="SuiteLayer" policy="dynamic" unbind="removeLayer"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/loginScreen.xml b/swt/org.argeo.app.ui/OSGI-INF/loginScreen.xml
new file mode 100644 (file)
index 0000000..6b3d49d
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="Default Login Screen">
+   <implementation class="org.argeo.app.swt.ux.DefaultLoginScreen"/>
+   <properties entry="config/loginScreen.properties"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <reference bind="setCmsContext" cardinality="1..1" interface="org.argeo.api.cms.CmsContext" name="CmsContext" policy="static"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/mapLayer.xml b/swt/org.argeo.app.ui/OSGI-INF/mapLayer.xml
new file mode 100644 (file)
index 0000000..372ca82
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="Map Layer">
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
+   <properties entry="config/mapLayer.properties"/>
+   <service>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <reference bind="setWorkArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.geo.ui.defaultMap)"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/peopleEntryArea.xml b/swt/org.argeo.app.ui/OSGI-INF/peopleEntryArea.xml
new file mode 100644 (file)
index 0000000..d3d5b29
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.people.PeopleEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <properties entry="config/peopleEntryArea.properties"/>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.api.cms.directory.CmsUserManager" name="CmsUserManager" policy="static"/>
+   <reference bind="setContentRepository" cardinality="1..1" interface="org.argeo.api.acr.ContentRepository" name="ContentRepository" policy="static"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/peopleLayer.xml b/swt/org.argeo.app.ui/OSGI-INF/peopleLayer.xml
new file mode 100644 (file)
index 0000000..a81391f
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="People Layer">
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
+   <properties entry="config/peopleLayer.properties"/>
+   <service>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <reference bind="setEntryArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.people.ui.peopleEntryArea)"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/personUiProvider.xml b/swt/org.argeo.app.ui/OSGI-INF/personUiProvider.xml
new file mode 100644 (file)
index 0000000..950301f
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init">
+   <implementation class="org.argeo.app.ui.people.PersonUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <property name="availableRoles" type="String">
+   </property>
+   <properties entry="config/personUiProvider.properties"/>
+   <reference bind="setCmsUserManager" cardinality="1..1" interface="org.argeo.api.cms.directory.CmsUserManager" name="CmsUserManager" policy="static"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml b/swt/org.argeo.app.ui/OSGI-INF/publishEntryArea.xml
new file mode 100644 (file)
index 0000000..0c10d34
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.publish.PublishEntryArea"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/publishEntryArea.properties"/>
+</scr:component>
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/OSGI-INF/publishUiProvider.xml b/swt/org.argeo.app.ui/OSGI-INF/publishUiProvider.xml
new file mode 100644 (file)
index 0000000..148da14
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0">
+   <implementation class="org.argeo.app.ui.publish.PublishUiProvider"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/publishUiProvider.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/recentItems.xml b/swt/org.argeo.app.ui/OSGI-INF/recentItems.xml
new file mode 100644 (file)
index 0000000..8656e84
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" name="Default Recent Items">
+   <implementation class="org.argeo.app.ui.RecentItems"/>
+   <service>
+      <provide interface="org.argeo.cms.swt.acr.SwtUiProvider"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <properties entry="config/recentItems.properties"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/OSGI-INF/wwwLayer.xml b/swt/org.argeo.app.ui/OSGI-INF/wwwLayer.xml
new file mode 100644 (file)
index 0000000..7a419ca
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy">
+   <implementation class="org.argeo.app.swt.ux.DefaultEditionLayer"/>
+   <properties entry="config/wwwLayer.properties"/>
+   <service>
+      <provide interface="org.argeo.app.swt.ux.SwtAppLayer"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="-1000"/>
+   <reference bind="setWorkArea" cardinality="1..1" interface="org.argeo.cms.swt.acr.SwtUiProvider" name="CmsUiProvider" policy="dynamic" target="(service.pid=argeo.publishing.ui.documentUiProvider)"/>
+</scr:component>
diff --git a/swt/org.argeo.app.ui/bnd.bnd b/swt/org.argeo.app.ui/bnd.bnd
new file mode 100644 (file)
index 0000000..fa61333
--- /dev/null
@@ -0,0 +1,42 @@
+Service-Component:\
+OSGI-INF/cmsApp.xml,\
+OSGI-INF/eventRecorder.xml,\
+OSGI-INF/header.xml,\
+OSGI-INF/footer.xml,\
+OSGI-INF/leadPane.xml,\
+OSGI-INF/loginScreen.xml,\
+OSGI-INF/recentItems.xml,\
+OSGI-INF/adminLeadPane.xml,\
+OSGI-INF/dashboard.xml,\
+OSGI-INF/dashboardLayer.xml,\
+OSGI-INF/peopleEntryArea.xml,\
+OSGI-INF/peopleLayer.xml,\
+OSGI-INF/personUiProvider.xml,\
+OSGI-INF/groupUiProvider.xml,\
+OSGI-INF/hierarchyUnitUiProvider.xml,\
+OSGI-INF/contentEntryArea.xml,\
+OSGI-INF/contentLayer.xml,\
+OSGI-INF/documentsFolder.xml,\
+OSGI-INF/fsEntryArea.xml,\
+OSGI-INF/mapLayer.xml,\
+OSGI-INF/defaultMap.xml,\
+OSGI-INF/wwwLayer.xml,\
+OSGI-INF/documentUiProvider.xml,\
+OSGI-INF/publishEntryArea.xml,\
+OSGI-INF/publishUiProvider.xml,\
+
+
+
+Import-Package:\
+org.argeo.cms.osgi,\
+org.argeo.cms.ui.widgets,\
+org.eclipse.swt,\
+org.osgi.framework,\
+org.eclipse.core.commands.common,\
+org.eclipse.jface.window,\
+org.eclipse.jface.dialogs,\
+org.eclipse.rap.rwt,\
+org.argeo.app.geo.swt,\
+javax.servlet.*;version="[3,5)",\
+javax.jcr.nodetype,\
+*
diff --git a/swt/org.argeo.app.ui/build.properties b/swt/org.argeo.app.ui/build.properties
new file mode 100644 (file)
index 0000000..d829967
--- /dev/null
@@ -0,0 +1,10 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/,\
+               config/,\
+               OSGI-INF/loginScreen.xml,\
+               OSGI-INF/dashboard.xml,\
+               OSGI-INF/recentItems.xml,\
+               OSGI-INF/dashboardLayer.xml
+source.. = src/
diff --git a/swt/org.argeo.app.ui/config/adminLeadPane.properties b/swt/org.argeo.app.ui/config/adminLeadPane.properties
new file mode 100644 (file)
index 0000000..90b9b04
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.adminLeadPane
diff --git a/swt/org.argeo.app.ui/config/cmsApp.properties b/swt/org.argeo.app.ui/config/cmsApp.properties
new file mode 100644 (file)
index 0000000..6735f81
--- /dev/null
@@ -0,0 +1,5 @@
+service.pid=argeo.suite.ui.app
+
+event.topics=argeo/suite/*
+
+argeo.cms.app.contextName=argeo
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/contentEntryArea.properties b/swt/org.argeo.app.ui/config/contentEntryArea.properties
new file mode 100644 (file)
index 0000000..855fe97
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.library.ui.contentEntryArea
diff --git a/swt/org.argeo.app.ui/config/contentLayer.properties b/swt/org.argeo.app.ui/config/contentLayer.properties
new file mode 100644 (file)
index 0000000..c1ca8e3
--- /dev/null
@@ -0,0 +1,6 @@
+service.pid=argeo.library.ui.contentLayer
+
+title=%content
+icon=documents
+
+entity.type=nt:folder,nt:file,entity:space,entity:document
diff --git a/swt/org.argeo.app.ui/config/dashboard.properties b/swt/org.argeo.app.ui/config/dashboard.properties
new file mode 100644 (file)
index 0000000..1832543
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.dashboard
diff --git a/swt/org.argeo.app.ui/config/dashboardLayer.properties b/swt/org.argeo.app.ui/config/dashboardLayer.properties
new file mode 100644 (file)
index 0000000..79abe4c
--- /dev/null
@@ -0,0 +1,4 @@
+service.pid=argeo.suite.ui.dashboardLayer
+
+title=Dashboard
+icon=dashboard
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/defaultMap.properties b/swt/org.argeo.app.ui/config/defaultMap.properties
new file mode 100644 (file)
index 0000000..fb14459
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.geo.ui.defaultMap
diff --git a/swt/org.argeo.app.ui/config/documentUiProvider.properties b/swt/org.argeo.app.ui/config/documentUiProvider.properties
new file mode 100644 (file)
index 0000000..339a444
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.publishing.ui.documentUiProvider
+
+entity.type=nt:file
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/documentsFolder.properties b/swt/org.argeo.app.ui/config/documentsFolder.properties
new file mode 100644 (file)
index 0000000..349e930
--- /dev/null
@@ -0,0 +1 @@
+entity.type=nt:folder
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/eventRecorder.properties b/swt/org.argeo.app.ui/config/eventRecorder.properties
new file mode 100644 (file)
index 0000000..6503863
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.suite.ui.eventRecorder
+
+event.topics=argeo/suite/*
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/footer.properties b/swt/org.argeo.app.ui/config/footer.properties
new file mode 100644 (file)
index 0000000..12aca56
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.footer
diff --git a/swt/org.argeo.app.ui/config/fsEntryArea.properties b/swt/org.argeo.app.ui/config/fsEntryArea.properties
new file mode 100644 (file)
index 0000000..0bceaf0
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.library.ui.fsEntryArea
diff --git a/swt/org.argeo.app.ui/config/groupUiProvider.properties b/swt/org.argeo.app.ui/config/groupUiProvider.properties
new file mode 100644 (file)
index 0000000..d3c2fb3
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.people.ui.groupUiProvider
+
+entity.type=ldap:groupOfNames
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/header.properties b/swt/org.argeo.app.ui/config/header.properties
new file mode 100644 (file)
index 0000000..034d5f5
--- /dev/null
@@ -0,0 +1,4 @@
+service.pid=argeo.suite.ui.header
+argeo.suite.ui=true
+
+argeo.suite.ui.header.title=%appTitle
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/hierarchyUnitUiProvider.properties b/swt/org.argeo.app.ui/config/hierarchyUnitUiProvider.properties
new file mode 100644 (file)
index 0000000..2611a39
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.people.ui.hierarchyUnitUiProvider
+
+entity.type=ldap:organizationalUnit,ldap:nsContainer,ldap:dcObject
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/leadPane.properties b/swt/org.argeo.app.ui/config/leadPane.properties
new file mode 100644 (file)
index 0000000..0d7b193
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.leadPane
diff --git a/swt/org.argeo.app.ui/config/loginScreen.properties b/swt/org.argeo.app.ui/config/loginScreen.properties
new file mode 100644 (file)
index 0000000..332614d
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.loginScreen
diff --git a/swt/org.argeo.app.ui/config/mapLayer.properties b/swt/org.argeo.app.ui/config/mapLayer.properties
new file mode 100644 (file)
index 0000000..37bf3c7
--- /dev/null
@@ -0,0 +1,6 @@
+service.pid=argeo.geo.ui.mapLayer
+
+title=%map
+icon=map
+
+entity.type=entity:geopoint
diff --git a/swt/org.argeo.app.ui/config/overviewMap.properties b/swt/org.argeo.app.ui/config/overviewMap.properties
new file mode 100644 (file)
index 0000000..d842c98
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.geo.ui.overviewMap
diff --git a/swt/org.argeo.app.ui/config/peopleEntryArea.properties b/swt/org.argeo.app.ui/config/peopleEntryArea.properties
new file mode 100644 (file)
index 0000000..37b28f9
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.people.ui.peopleEntryArea
diff --git a/swt/org.argeo.app.ui/config/peopleLayer.properties b/swt/org.argeo.app.ui/config/peopleLayer.properties
new file mode 100644 (file)
index 0000000..9224d1b
--- /dev/null
@@ -0,0 +1,7 @@
+service.pid=argeo.people.ui.peopleLayer
+
+icon=people
+weights=4000,6000
+title=%people
+
+entity.type=ldap:inetOrgPerson,ldap:groupOfNames,ldap:organizationalUnit,ldap:nsContainer,ldap:dcObject
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/personUiProvider.properties b/swt/org.argeo.app.ui/config/personUiProvider.properties
new file mode 100644 (file)
index 0000000..27963d1
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.people.ui.personUiProvider
+
+entity.type=ldap:inetOrgPerson,ldap:posixAccount
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/publishEntryArea.properties b/swt/org.argeo.app.ui/config/publishEntryArea.properties
new file mode 100644 (file)
index 0000000..f391774
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.publish.ui.publishEntryArea
diff --git a/swt/org.argeo.app.ui/config/publishUiProvider.properties b/swt/org.argeo.app.ui/config/publishUiProvider.properties
new file mode 100644 (file)
index 0000000..7555eda
--- /dev/null
@@ -0,0 +1,3 @@
+service.pid=argeo.publishing.ui.publishUiProvider
+
+entity.type=entity:document
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/config/recentItems.properties b/swt/org.argeo.app.ui/config/recentItems.properties
new file mode 100644 (file)
index 0000000..7321c55
--- /dev/null
@@ -0,0 +1 @@
+service.pid=argeo.suite.ui.recentItems
diff --git a/swt/org.argeo.app.ui/config/wwwLayer.properties b/swt/org.argeo.app.ui/config/wwwLayer.properties
new file mode 100644 (file)
index 0000000..d29fa5b
--- /dev/null
@@ -0,0 +1,4 @@
+service.pid=argeo.publishing.ui.wwwLayer
+
+title=Web
+icon=map
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/jface/JFaceUtils.java b/swt/org.argeo.app.ui/src/org/argeo/app/jface/JFaceUtils.java
new file mode 100644 (file)
index 0000000..3e633bc
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.app.jface;
+
+import org.eclipse.jface.viewers.AbstractTableViewer;
+import org.eclipse.jface.viewers.ColumnViewer;
+import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
+import org.eclipse.jface.viewers.Viewer;
+
+/** Utilities around JFace. */
+public class JFaceUtils {
+       /**
+        * TootlTip support is supported only for {@link AbstractTableViewer} in RAP
+        */
+       public static void enableToolTipSupport(Viewer viewer) {
+               if (viewer instanceof ColumnViewer)
+                       ColumnViewerToolTipSupport.enableFor((ColumnViewer) viewer);
+       }
+
+       /** singleton */
+       private JFaceUtils() {
+
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultDashboard.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/DefaultDashboard.java
new file mode 100644 (file)
index 0000000..aebacfa
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.app.ui;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+/** Provides a dashboard. */
+public class DefaultDashboard implements CmsUiProvider {
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               parent.setLayout(new GridLayout());
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               if (cmsView.isAnonymous())
+                       throw new IllegalStateException("No user is not logged in");
+
+               Label lbl = new Label(parent, SWT.NONE);
+               lbl.setText("Welcome " + CurrentUser.getDisplayName() + "!");
+
+               return lbl;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/EventRecorder.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/EventRecorder.java
new file mode 100644 (file)
index 0000000..7c31601
--- /dev/null
@@ -0,0 +1,27 @@
+package org.argeo.app.ui;
+
+import java.util.Map;
+
+import org.argeo.api.cms.CmsEventSubscriber;
+import org.argeo.api.cms.CmsLog;
+
+/** Record UI events. */
+public class EventRecorder implements CmsEventSubscriber {
+       private final static CmsLog log = CmsLog.getLog(EventRecorder.class);
+
+       public void init() {
+
+       }
+
+       public void destroy() {
+
+       }
+
+       @Override
+       public void onEvent(String topic, Map<String, Object> properties) {
+               if (log.isTraceEnabled())
+                       log.trace(topic + ": " + properties);
+
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/RecentItems.java
new file mode 100644 (file)
index 0000000..c9bcd5a
--- /dev/null
@@ -0,0 +1,366 @@
+package org.argeo.app.ui;
+
+import static org.argeo.eclipse.ui.EclipseUiUtils.notEmpty;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.query.Query;
+import javax.jcr.query.QueryResult;
+
+import org.argeo.api.app.EntityType;
+import org.argeo.app.jcr.XPathUtils;
+import org.argeo.app.ui.widgets.DelayedText;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** List recent items. */
+public class RecentItems implements CmsUiProvider {
+       private final static int SEARCH_TEXT_DELAY = 800;
+       private final static int SEARCH_DEFAULT_LIMIT = 100;
+
+       private CmsSwtTheme theme;
+
+       private String entityType;
+
+       static enum Property {
+               entityTypes;
+       }
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               theme = CmsSwtUtils.getCmsTheme(parent);
+               parent.setLayout(new GridLayout());
+//             parent.setLayout(CmsUiUtils.noSpaceGridLayout());
+               parent.setLayout(new GridLayout());
+
+//             Composite top = new Composite(parent, SWT.BORDER);
+//             CmsUiUtils.style(top, SuiteStyle.recentItems);
+//             top.setLayoutData(CmsUiUtils.fillWidth());
+//             top.setLayout(CmsUiUtils.noSpaceGridLayout(2));
+//             Label lbl = new Label(top, SWT.FLAT);
+//             lbl.setLayoutData(CmsUiUtils.fillWidth());
+//             lbl.setText(SuiteMsg.recentItems.lead());
+//             CmsUiUtils.style(lbl, SuiteStyle.recentItems);
+//
+//             ToolBar topToolBar = new ToolBar(top, SWT.NONE);
+//             ToolItem addItem = new ToolItem(topToolBar, SWT.FLAT);
+////           CmsUiUtils.style(addItem, SuiteStyle.recentItems);
+//             addItem.setImage(SuiteIcon.add.getSmallIcon(theme));
+
+               if (context == null)
+                       return null;
+               SingleEntityViewer entityViewer = new SingleEntityViewer(parent, SWT.NONE, context.getSession());
+               entityViewer.createUi();
+               entityViewer.getViewer().getTable().setLayoutData(CmsSwtUtils.fillAll());
+
+               Composite bottom = new Composite(parent, SWT.NONE);
+               bottom.setLayoutData(CmsSwtUtils.fillWidth());
+               bottom.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
+               bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
+               ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
+               deleteItem.setEnabled(false);
+//             CmsUiUtils.style(deleteItem, SuiteStyle.recentItems);
+               deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
+               ToolItem addItem = new ToolItem(bottomToolBar, SWT.FLAT);
+               addItem.setImage(theme.getSmallIcon(SuiteIcon.add));
+               entityViewer.getViewer().addDoubleClickListener(new IDoubleClickListener() {
+
+                       @Override
+                       public void doubleClick(DoubleClickEvent event) {
+                               Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
+                               if (node != null)
+                                       CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.openNewPart.topic(),
+                                                       SuiteUiUtils.eventProperties(node));
+
+                       }
+               });
+               entityViewer.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               Node node = (Node) entityViewer.getViewer().getStructuredSelection().getFirstElement();
+                               if (node != null) {
+                                       CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.refreshPart.topic(),
+                                                       SuiteUiUtils.eventProperties(node));
+                                       deleteItem.setEnabled(true);
+                               } else {
+                                       deleteItem.setEnabled(false);
+                               }
+                       }
+               });
+
+               return entityViewer.filterTxt;
+
+       }
+
+       public void init(Map<String, String> properties) {
+               // TODO manage multiple entities
+               entityType = properties.get(Property.entityTypes.name());
+       }
+
+       class SingleEntityViewer {
+               Composite parent;
+               Text filterTxt;
+               TableViewer viewer;
+               Session session;
+
+               public SingleEntityViewer(Composite parent, int style, Session session) {
+                       this.parent = parent;
+                       this.session = session;
+               }
+
+               public void createUi() {
+                       // MainLayout
+                       addFilterPanel(parent);
+                       viewer = createListPart(parent, new SingleEntityLabelProvider());
+                       refreshFilteredList();
+
+                       try {
+                               String[] nodeTypes = entityType != null && entityType.contains(":") ? new String[] { entityType }
+                                               : null;
+                               session.getWorkspace().getObservationManager().addEventListener(new EventListener() {
+
+                                       @Override
+                                       public void onEvent(EventIterator events) {
+                                               parent.getDisplay().asyncExec(() -> refreshFilteredList());
+                                       }
+                               }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED, "/", true,
+                                               null, nodeTypes, false);
+                       } catch (RepositoryException e) {
+                               throw new IllegalStateException("Cannot add JCR observer", e);
+                       }
+
+               }
+
+               private void addFilterPanel(Composite parent) {
+                       // Use a delayed text: the query won't be done until the user stop
+                       // typing for 800ms
+                       int style = SWT.BORDER | SWT.SEARCH | SWT.ICON_CANCEL;
+                       DelayedText delayedText = new DelayedText(parent, style, SEARCH_TEXT_DELAY);
+                       filterTxt = delayedText.getText();
+                       filterTxt.setLayoutData(EclipseUiUtils.fillWidth());
+
+                       // final ServerPushSession pushSession = new ServerPushSession();
+                       delayedText.addListener((s) -> refreshFilteredList());
+//                     delayedText.addDelayedModifyListener(null, new ModifyListener() {
+//                             private static final long serialVersionUID = 5003010530960334977L;
+//
+//                             public void modifyText(ModifyEvent event) {
+//                                     delayedText.getText().getDisplay().asyncExec(new Runnable() {
+//                                             @Override
+//                                             public void run() {
+//                                                     refreshFilteredList();
+//                                             }
+//                                     });
+//                                     // pushSession.stop();
+//                             }
+//                     });
+
+                       // Jump to the first item of the list using the down arrow
+                       filterTxt.addKeyListener(new KeyListener() {
+                               private static final long serialVersionUID = -4523394262771183968L;
+
+                               @Override
+                               public void keyReleased(KeyEvent e) {
+                               }
+
+                               @Override
+                               public void keyPressed(KeyEvent e) {
+                                       // boolean shiftPressed = (e.stateMask & SWT.SHIFT) != 0;
+                                       // boolean altPressed = (e.stateMask & SWT.ALT) != 0;
+                                       if (e.keyCode == SWT.ARROW_DOWN || e.keyCode == SWT.TAB) {
+//                                     Object first = entityViewer.getElementAt(0);
+//                                     if (first != null) {
+//                                             entityViewer.getTable().setFocus();
+//                                             entityViewer.setSelection(new StructuredSelection(first), true);
+//                                     }
+                                               e.doit = false;
+                                       }
+                               }
+                       });
+
+//                     parent.addDisposeListener((e) -> {
+//                             delayedText.close();
+//                     });
+               }
+
+               protected TableViewer createListPart(Composite parent, ILabelProvider labelProvider) {
+//                     parent.setLayout(new GridLayout());
+//                     parent.setLayout(CmsUiUtils.noSpaceGridLayout());
+
+                       Composite tableComposite = new Composite(parent, SWT.NONE);
+                       GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_VERTICAL
+                                       | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
+                       tableComposite.setLayoutData(gd);
+
+                       TableViewer viewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+                       viewer.setLabelProvider(labelProvider);
+
+                       TableColumn singleColumn = new TableColumn(viewer.getTable(), SWT.V_SCROLL);
+                       TableColumnLayout tableColumnLayout = new TableColumnLayout();
+                       tableColumnLayout.setColumnData(singleColumn, new ColumnWeightData(85));
+                       tableComposite.setLayout(tableColumnLayout);
+
+                       // Corresponding table & style
+                       Table table = viewer.getTable();
+//                     Listener[] mouseDownListeners = table.getListeners(SWT.MouseDown);
+//                     for (Listener listener :  table.getListeners(SWT.MouseDown))
+//                             table.removeListener(SWT.MouseDown, listener);
+//                     for (Listener listener :  table.getListeners(SWT.MouseUp))
+//                             table.removeListener(SWT.MouseUp, listener);
+//                     for (Listener listener :  table.getListeners(SWT.MouseDoubleClick))
+//                             table.removeListener(SWT.MouseDoubleClick, listener);
+//                     
+//                     table.addMouseListener(new MouseListener() {
+//
+//                             @Override
+//                             public void mouseUp(MouseEvent e) {
+//                                     System.out.println("Mouse up: "+e);
+//                             }
+//
+//                             @Override
+//                             public void mouseDown(MouseEvent e) {
+//                                     System.out.println("Mouse down: "+e);
+//                             }
+//
+//                             @Override
+//                             public void mouseDoubleClick(MouseEvent e) {
+//                                     System.out.println("Mouse double: "+e);
+//
+//                             }
+//                     });
+                       table.setLinesVisible(true);
+                       table.setHeaderVisible(false);
+                       // CmsUiUtils.markup(table);
+                       // CmsUiUtils.setItemHeight(table, 26);
+
+                       viewer.setContentProvider(new BasicNodeListContentProvider());
+                       return viewer;
+               }
+
+//             public boolean setFocus() {
+//                     refreshFilteredList();
+//                     return parent.setFocus();
+//             }
+
+               public void forceRefresh(Object object) {
+                       refreshFilteredList();
+               }
+
+               protected void refreshFilteredList() {
+                       try {
+                               String filter = filterTxt.getText();
+                               // Prevents the query on the full repository
+                               // if (isEmpty(filter)) {
+                               // entityViewer.setInput(null);
+                               // return;
+                               // }
+
+                               // XPATH Query
+                               String xpathQueryStr;
+                               if (entityType != null) {
+                                       int indexColumn = entityType.indexOf(':');
+                                       if (indexColumn > 0) {// JCR node type
+                                               xpathQueryStr = "//element(*, " + entityType + ") order by @jcr:created descending";
+                                       } else {
+                                               xpathQueryStr = entityType.contains(":") ? "//element(*, " + entityType + ")"
+                                                               : "//element(*, " + EntityType.entity.get() + ")[@entity:type='" + entityType + "']";
+                                       }
+                               } else {
+                                       xpathQueryStr = "//element(*, " + EntityType.entity.get() + ")";
+                               }
+//                     String xpathQueryStr = "//element(*, " + ConnectTypes.CONNECT_ENTITY + ")";
+                               String xpathFilter = XPathUtils.getFreeTextConstraint(filter);
+                               if (notEmpty(xpathFilter))
+                                       xpathQueryStr += "[" + xpathFilter + "]";
+
+//                             long begin = System.currentTimeMillis();
+                               // session.refresh(false);
+                               Query xpathQuery = XPathUtils.createQuery(session, xpathQueryStr);
+
+                               xpathQuery.setLimit(SEARCH_DEFAULT_LIMIT);
+                               QueryResult result = xpathQuery.execute();
+
+                               NodeIterator nit = result.getNodes();
+                               viewer.setInput(JcrUtils.nodeIteratorToList(nit));
+//                             if (log.isTraceEnabled()) {
+//                                     long end = System.currentTimeMillis();
+//                                     log.trace("Quick Search - Found: " + nit.getSize() + " in " + (end - begin)
+//                                                     + " ms by executing XPath query (" + xpathQueryStr + ").");
+//                             }
+                       } catch (RepositoryException e) {
+                               throw new IllegalStateException("Unable to list entities", e);
+                       }
+               }
+
+               public TableViewer getViewer() {
+                       return viewer;
+               }
+
+               class SingleEntityLabelProvider extends ColumnLabelProvider {
+                       private static final long serialVersionUID = -2209337675781795677L;
+
+                       @Override
+                       public String getText(Object element) {
+                               return Jcr.getTitle((Node) element);
+                       }
+
+               }
+
+               class BasicNodeListContentProvider implements IStructuredContentProvider {
+                       private static final long serialVersionUID = 1L;
+                       // keep a cache of the Nodes in the content provider to be able to
+                       // manage long request
+                       private List<Node> nodes;
+
+                       public void dispose() {
+                       }
+
+                       /** Expects a list of nodes as a new input */
+                       @SuppressWarnings("unchecked")
+                       public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+                               nodes = (List<Node>) newInput;
+                       }
+
+                       public Object[] getElements(Object arg0) {
+                               return nodes.toArray();
+                       }
+               }
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/SuiteUiUtils.java
new file mode 100644 (file)
index 0000000..f5cfba5
--- /dev/null
@@ -0,0 +1,246 @@
+package org.argeo.app.ui;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.api.app.EntityNames;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.api.cms.ux.CmsStyle;
+import org.argeo.app.swt.ux.SuiteSwtUtils;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.jcr.acr.JcrContent;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.dialogs.LightweightDialog;
+import org.argeo.cms.ui.util.CmsLink;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** UI utilities around SWT and JCR. */
+@Deprecated
+public class SuiteUiUtils {
+       public static Text addFormLine(Composite parent, String label, Node node, String property,
+                       CmsEditable cmsEditable) {
+               Composite lineComposite = SuiteSwtUtils.addLineComposite(parent, 2);
+               SuiteSwtUtils.addFormLabel(lineComposite, label);
+               String text = Jcr.get(node, property);
+               Text txt = SuiteSwtUtils.addFormTextField(lineComposite, text, null, SWT.WRAP);
+               if (cmsEditable != null && cmsEditable.isEditing()) {
+                       txt.addModifyListener((e) -> {
+                               Jcr.set(node, property, txt.getText());
+                               Jcr.save(node);
+                       });
+               } else {
+                       txt.setEditable(false);
+               }
+               txt.setLayoutData(CmsSwtUtils.fillWidth());
+               return txt;
+       }
+
+       public static Text addFormColumn(Composite parent, String label, Node node, String property,
+                       CmsEditable cmsEditable) {
+               SuiteSwtUtils.addFormLabel(parent, label);
+               String text = Jcr.get(node, property);
+               Text txt = SuiteSwtUtils.addFormTextField(parent, text, null, SWT.WRAP);
+               if (cmsEditable != null && cmsEditable.isEditing()) {
+                       txt.addModifyListener((e) -> {
+                               Jcr.set(node, property, txt.getText());
+                               Jcr.save(node);
+                       });
+               } else {
+                       txt.setEditable(false);
+               }
+               txt.setLayoutData(CmsSwtUtils.fillWidth());
+               return txt;
+       }
+
+//     public static Label addFormPicture(Composite parent, String label, Node fileNode) throws RepositoryException {
+//             Composite lineComposite = SuiteSwtUtils.addLineComposite(parent, 2);
+//             SuiteSwtUtils.addFormLabel(lineComposite, label);
+//
+//             return addPicture(lineComposite, fileNode);
+//     }
+
+       public static Label addPicture(Composite parent, Node fileNode) throws RepositoryException {
+               return addPicture(parent, fileNode, null);
+       }
+
+       public static Label addPicture(Composite parent, Node fileNode, Integer maxWidth) throws RepositoryException {
+               return addPicture(parent, fileNode, maxWidth, null);
+       }
+
+       public static Label addPicture(Composite parent, Node fileNode, Integer maxWidth, Node link)
+                       throws RepositoryException {
+               Node content = fileNode.getNode(Node.JCR_CONTENT);
+
+               boolean test = false;
+               if (test) {
+                       try (InputStream in = JcrUtils.getFileAsStream(fileNode);
+                                       OutputStream out = Files.newOutputStream(
+                                                       Paths.get(System.getProperty("user.home") + "/tmp/" + fileNode.getName()));) {
+//                             BufferedImage img = ImageIO.read(in);
+//                             System.out.println(fileNode.getName() + ": width=" + img.getWidth() + ", height=" + img.getHeight());
+                               IOUtils.copy(in, out);
+                       } catch (IOException e) {
+                               throw new RuntimeException(e);
+                       }
+
+//                     try (InputStream in = JcrUtils.getFileAsStream(fileNode);) {
+//                             ImageData imageData = new ImageData(in);
+//                             System.out.println(fileNode.getName() + ": width=" + imageData.width + ", height=" + imageData.height);
+//                     } catch (IOException e) {
+//                             throw new RuntimeException(e);
+//                     }
+               }
+               // TODO move it deeper in the middleware.
+               if (!content.isNodeType(EntityType.box.get())) {
+                       if (content.getSession().hasPermission(content.getPath(), Session.ACTION_SET_PROPERTY)) {
+                               try (InputStream in = JcrUtils.getFileAsStream(fileNode)) {
+                                       ImageData imageData = new ImageData(in);
+                                       content.addMixin(EntityType.box.get());
+                                       content.setProperty(EntityNames.SVG_WIDTH, imageData.width);
+                                       content.setProperty(EntityNames.SVG_HEIGHT, imageData.height);
+                                       content.getSession().save();
+                               } catch (IOException e) {
+                                       throw new RuntimeException(e);
+                               }
+                       }
+               }
+
+               // TODO optimise
+               Long width;
+               Long height;
+               if (content.isNodeType(EntityType.box.get())) {
+                       width = content.getProperty(EntityNames.SVG_WIDTH).getLong();
+                       height = content.getProperty(EntityNames.SVG_HEIGHT).getLong();
+               } else {
+                       try (InputStream in = JcrUtils.getFileAsStream(fileNode)) {
+                               ImageData imageData = new ImageData(in);
+                               width = Long.valueOf(imageData.width);
+                               height = Long.valueOf(imageData.height);
+                       } catch (IOException e) {
+                               throw new RuntimeException(e);
+                       }
+               }
+
+               if (maxWidth != null && width > maxWidth) {
+                       Double ratio = maxWidth.doubleValue() / width.doubleValue();
+                       width = maxWidth.longValue();
+                       height = Math.round(ratio * height);
+               }
+               Label img = new Label(parent, SWT.NONE);
+               CmsSwtUtils.markup(img);
+               StringBuffer txt = new StringBuffer();
+               String target = toLink(link);
+               if (target != null)
+                       txt.append("<a href='").append(target).append("'>");
+               txt.append(CmsUiUtils.img(fileNode, width.toString(), height.toString()));
+               if (target != null)
+                       txt.append("</a>");
+               img.setText(txt.toString());
+               if (parent.getLayout() instanceof GridLayout) {
+                       GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
+                       gd.widthHint = width.intValue();
+                       gd.heightHint = height.intValue();
+                       img.setLayoutData(gd);
+               }
+
+               if (target == null)
+                       img.addMouseListener(new MouseListener() {
+                               private static final long serialVersionUID = -1362242049325206168L;
+
+                               @Override
+                               public void mouseUp(MouseEvent e) {
+                               }
+
+                               @Override
+                               public void mouseDown(MouseEvent e) {
+                               }
+
+                               @Override
+                               public void mouseDoubleClick(MouseEvent e) {
+                                       LightweightDialog dialog = new LightweightDialog(img.getShell()) {
+
+                                               @Override
+                                               protected Control createDialogArea(Composite parent) {
+                                                       parent.setLayout(new GridLayout());
+                                                       ScrolledComposite scroll = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+                                                       scroll.setLayoutData(CmsSwtUtils.fillAll());
+                                                       scroll.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                                                       scroll.setExpandHorizontal(true);
+                                                       scroll.setExpandVertical(true);
+                                                       // scroll.setAlwaysShowScrollBars(true);
+
+                                                       Composite c = new Composite(scroll, SWT.NONE);
+                                                       scroll.setContent(c);
+                                                       c.setLayout(new GridLayout());
+                                                       c.setLayoutData(CmsSwtUtils.fillAll());
+                                                       Label bigImg = new Label(c, SWT.NONE);
+                                                       CmsSwtUtils.markup(bigImg);
+                                                       bigImg.setText(CmsUiUtils.img(fileNode, Jcr.get(content, EntityNames.SVG_WIDTH),
+                                                                       Jcr.get(content, EntityNames.SVG_HEIGHT)));
+                                                       bigImg.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+                                                       return bigImg;
+                                               }
+
+                                               @Override
+                                               protected Point getInitialSize() {
+                                                       Point shellSize = img.getShell().getSize();
+                                                       return new Point(shellSize.x - 100, shellSize.y - 100);
+                                               }
+
+                                       };
+                                       dialog.open();
+                               }
+                       });
+               return img;
+       }
+
+       public static String toLink(Node node) {
+               return node != null ? "#" + ContentUtils.cleanPathForUrl(JcrContent.nodeToContent(node).getPath()) : null;
+       }
+
+       public static Control addLink(Composite parent, String label, Node node, CmsStyle style)
+                       throws RepositoryException {
+               String target = toLink(node);
+               CmsLink link = new CmsLink(label, target, style);
+               return link.createUi(parent, node);
+       }
+
+       @Deprecated
+       public static Map<String, Object> eventProperties(Node node) {
+               Map<String, Object> properties = new HashMap<>();
+               String contentPath = '/' + Jcr.getWorkspaceName(node) + Jcr.getPath(node);
+               properties.put(SuiteUxEvent.CONTENT_PATH, contentPath);
+               return properties;
+       }
+
+       /** Singleton. */
+       private SuiteUiUtils() {
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonPage.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonPage.java
new file mode 100644 (file)
index 0000000..51ab5ba
--- /dev/null
@@ -0,0 +1,72 @@
+package org.argeo.app.ui.dialogs;
+
+import org.argeo.app.swt.ux.SuiteSwtUtils;
+import org.argeo.app.ux.SuiteMsg;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+public class NewPersonPage extends WizardPage {
+       private static final long serialVersionUID = -944349994177526468L;
+       protected Text lastNameTxt;
+       protected Text firstNameTxt;
+       protected Text emailTxt;
+
+       protected NewPersonPage(String pageName) {
+               super(pageName);
+               setTitle(SuiteMsg.personWizardPageTitle.lead());
+       }
+
+       @Override
+       public void createControl(Composite parent) {
+               parent.setLayout(new GridLayout(2, false));
+
+               // FirstName
+               SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.firstName);
+               firstNameTxt = new Text(parent, SWT.BORDER);
+               firstNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+               // LastName
+               SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.lastName);
+               lastNameTxt = new Text(parent, SWT.BORDER);
+               lastNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+               SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.email);
+               emailTxt = new Text(parent, SWT.BORDER);
+               emailTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+               ModifyListener ml = new ModifyListener() {
+                       private static final long serialVersionUID = -1628130380128946886L;
+
+                       @Override
+                       public void modifyText(ModifyEvent event) {
+                               getContainer().updateButtons();
+                       }
+               };
+
+               firstNameTxt.addModifyListener(ml);
+               lastNameTxt.addModifyListener(ml);
+               emailTxt.addModifyListener(ml);
+
+               // Don't forget this.
+               setControl(firstNameTxt);
+               firstNameTxt.setFocus();
+
+       }
+
+//     public void updateNode(Node node, PeopleService peopleService, ResourcesService resourcesService) {
+//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_LAST_NAME, PropertyType.STRING, lastNameTxt.getText());
+//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_FIRST_NAME, PropertyType.STRING,
+//                             firstNameTxt.getText());
+//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_DISPLAY_NAME, PropertyType.STRING,
+//                             firstNameTxt.getText() + " " + lastNameTxt.getText());
+//             String email = emailTxt.getText();
+//             ConnectJcrUtils.setJcrProperty(node, PeopleNames.PEOPLE_PRIMARY_EMAIL, PropertyType.STRING, email);
+//             PeopleJcrUtils.createEmail(resourcesService, peopleService, node, email, true, null, null);
+//     }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonWizard.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/dialogs/NewPersonWizard.java
new file mode 100644 (file)
index 0000000..841c294
--- /dev/null
@@ -0,0 +1,151 @@
+package org.argeo.app.ui.dialogs;
+
+import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
+
+import javax.jcr.Node;
+
+import org.argeo.app.swt.ux.SuiteSwtUtils;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+/** Ask first & last name. Update the passed node on finish */
+public class NewPersonWizard extends Wizard {
+       // private final static Log log = LogFactory.getLog(NewPersonWizard.class);
+
+       // Context
+       private Node person;
+
+       // This page widgets
+       protected Text lastNameTxt;
+       protected Text firstNameTxt;
+       // private Button useDistinctDisplayNameBtn;
+       // private Text displayNameTxt;
+
+       public NewPersonWizard(Node person) {
+               this.person = person;
+       }
+
+       @Override
+       public void addPages() {
+               try {
+                       MainInfoPage page = new MainInfoPage("Main page");
+                       addPage(page);
+               } catch (Exception e) {
+                       throw new RuntimeException("Cannot add page to wizard", e);
+               }
+               setWindowTitle(SuiteMsg.personWizardWindowTitle.lead());
+       }
+
+       /**
+        * Called when the user click on 'Finish' in the wizard. The task is then
+        * created and the corresponding session saved.
+        */
+       @Override
+       public boolean performFinish() {
+               String lastName = lastNameTxt.getText();
+               String firstName = firstNameTxt.getText();
+               // String displayName = displayNameTxt.getText();
+               // boolean useDistinct = useDistinctDisplayNameBtn.getSelection();
+               if (EclipseUiUtils.isEmpty(lastName) && EclipseUiUtils.isEmpty(firstName)) {
+                       MessageDialog.openError(getShell(), "Non-valid information",
+                                       "Please enter at least a name that is not empty.");
+                       return false;
+               } else {
+//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_LAST_NAME, PropertyType.STRING, lastName);
+//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_FIRST_NAME, PropertyType.STRING, firstName);
+//                     String fullName = firstName + " " + lastName;
+//                     ConnectJcrUtils.setJcrProperty(person, PEOPLE_DISPLAY_NAME, PropertyType.STRING, fullName);
+                       return true;
+               }
+       }
+
+       @Override
+       public boolean performCancel() {
+               return true;
+       }
+
+       @Override
+       public boolean canFinish() {
+               String lastName = lastNameTxt.getText();
+               String firstName = firstNameTxt.getText();
+               if (isEmpty(lastName) && isEmpty(firstName)) {
+                       return false;
+               } else
+                       return true;
+       }
+
+       protected class MainInfoPage extends WizardPage {
+               private static final long serialVersionUID = 1L;
+
+               public MainInfoPage(String pageName) {
+                       super(pageName);
+                       setTitle(SuiteMsg.personWizardPageTitle.lead());
+                       // setMessage("Please enter a last name and/or a first name.");
+               }
+
+               public void createControl(Composite parent) {
+                       parent.setLayout(new GridLayout(2, false));
+
+                       // FirstName
+                       SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.firstName);
+                       firstNameTxt = new Text(parent, SWT.BORDER);
+                       // firstNameTxt.setMessage("a first name");
+                       firstNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       // LastName
+                       SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.lastName);
+                       lastNameTxt = new Text(parent, SWT.BORDER);
+                       // lastNameTxt.setMessage("a last name");
+                       lastNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       // Display Name
+                       // useDistinctDisplayNameBtn = new Button(parent, SWT.CHECK);
+                       // useDistinctDisplayNameBtn.setText("Define a disting display name");
+                       // useDistinctDisplayNameBtn.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
+                       // true, false, 2, 1));
+                       //
+                       // ConnectWorkbenchUtils.createBoldLabel(parent, "Display Name");
+                       // displayNameTxt = new Text(parent, SWT.BORDER);
+                       // displayNameTxt.setMessage("an optional display name");
+                       // displayNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
+                       // false));
+                       // displayNameTxt.setEnabled(false);
+                       //
+                       // useDistinctDisplayNameBtn.addSelectionListener(new SelectionAdapter() {
+                       // private static final long serialVersionUID = 1L;
+                       //
+                       // @Override
+                       // public void widgetSelected(SelectionEvent e) {
+                       // displayNameTxt.setEnabled(useDistinctDisplayNameBtn.getSelection());
+                       // }
+                       // });
+
+                       ModifyListener ml = new ModifyListener() {
+                               private static final long serialVersionUID = -1628130380128946886L;
+
+                               @Override
+                               public void modifyText(ModifyEvent event) {
+                                       getContainer().updateButtons();
+                               }
+                       };
+
+                       firstNameTxt.addModifyListener(ml);
+                       lastNameTxt.addModifyListener(ml);
+                       // displayNameTxt.addModifyListener(ml);
+
+                       // Don't forget this.
+                       setControl(firstNameTxt);
+                       firstNameTxt.setFocus();
+               }
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/AbstractDbkViewer.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/AbstractDbkViewer.java
new file mode 100644 (file)
index 0000000..16b3f42
--- /dev/null
@@ -0,0 +1,1034 @@
+package org.argeo.app.ui.docbook;
+
+import static org.argeo.app.docbook.DbkType.para;
+import static org.argeo.app.jcr.docbook.DbkJcrUtils.addDbk;
+import static org.argeo.app.jcr.docbook.DbkJcrUtils.isDbk;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Observer;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.Cms2DSize;
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.app.jcr.docbook.DbkJcrUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.ui.viewers.AbstractPageViewer;
+import org.argeo.cms.ui.viewers.NodePart;
+import org.argeo.cms.ui.viewers.PropertyPart;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.cms.ui.viewers.SectionPart;
+import org.argeo.cms.ui.widgets.EditableText;
+import org.argeo.cms.ui.widgets.StyledControl;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.rap.fileupload.FileDetails;
+import org.eclipse.rap.fileupload.FileUploadEvent;
+import org.eclipse.rap.fileupload.FileUploadHandler;
+import org.eclipse.rap.fileupload.FileUploadListener;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** Base class for text viewers and editors. */
+public abstract class AbstractDbkViewer extends AbstractPageViewer implements KeyListener, Observer {
+       private static final long serialVersionUID = -2401274679492339668L;
+       private final static CmsLog log = CmsLog.getLog(AbstractDbkViewer.class);
+
+       private final Section mainSection;
+
+       private TextInterpreter textInterpreter = new DbkTextInterpreter();
+       private DbkImageManager imageManager;
+
+       private FileUploadListener fileUploadListener;
+       private DbkContextMenu styledTools;
+
+       private final boolean flat;
+
+       private boolean showMainTitle = true;
+
+       private Integer maxMediaWidth = null;
+       private String defaultSectionStyle;
+
+       protected AbstractDbkViewer(Section parent, int style, CmsEditable cmsEditable) {
+               super(parent, style, cmsEditable);
+//             CmsView cmsView = CmsView.getCmsView(parent);
+//             imageManager = cmsView.getImageManager();
+               flat = SWT.FLAT == (style & SWT.FLAT);
+
+               if (getCmsEditable().canEdit()) {
+                       fileUploadListener = new FUL();
+                       styledTools = new DbkContextMenu(this, parent.getShell());
+               }
+               this.mainSection = parent;
+               Node baseFolder = Jcr.getParent(mainSection.getNode());
+               imageManager = new DbkImageManager(baseFolder);
+               initModelIfNeeded(mainSection.getNode());
+               // layout(this.mainSection);
+       }
+
+       @Override
+       public Control getControl() {
+               return mainSection;
+       }
+
+       protected void refresh(Control control) throws RepositoryException {
+               if (!(control instanceof Section))
+                       return;
+               long begin = System.currentTimeMillis();
+               Section section = (Section) control;
+               if (section instanceof TextSection) {
+                       CmsSwtUtils.clear(section);
+                       Node node = section.getNode();
+                       TextSection textSection = (TextSection) section;
+                       String style = node.hasProperty(DbkAttr.role.name()) ? node.getProperty(DbkAttr.role.name()).getString()
+                                       : getDefaultSectionStyle();
+                       if (style != null)
+                               CmsSwtUtils.style(textSection, style);
+
+                       // Title
+                       Node titleNode = null;
+                       // We give priority to ./title vs ./info/title, like the DocBook XSL
+                       if (node.hasNode(DbkType.title.get())) {
+                               titleNode = node.getNode(DbkType.title.get());
+                       } else if (node.hasNode(DbkType.info.get() + '/' + DbkType.title.get())) {
+                               titleNode = node.getNode(DbkType.info.get() + '/' + DbkType.title.get());
+                       }
+
+                       if (titleNode != null) {
+                               boolean showTitle = getMainSection() == section ? showMainTitle : true;
+                               if (showTitle) {
+                                       if (section.getHeader() == null)
+                                               section.createHeader();
+                                       DbkSectionTitle title = newSectionTitle(textSection, titleNode);
+                                       title.setLayoutData(CmsSwtUtils.fillWidth());
+                                       updateContent(title);
+                               }
+                       }
+
+                       // content
+                       for (NodeIterator ni = node.getNodes(); ni.hasNext();) {
+                               Node child = ni.nextNode();
+                               SectionPart sectionPart = null;
+                               if (isDbk(child, DbkType.mediaobject)) {
+                                       if (child.hasNode(DbkType.imageobject.get())) {
+                                               sectionPart = newImg(textSection, child);
+                                       } else if (child.hasNode(DbkType.videoobject.get())) {
+                                               sectionPart = newVideo(textSection, child);
+                                       } else {
+                                               throw new IllegalArgumentException("Unsupported media object " + child);
+                                       }
+                               } else if (isDbk(child, DbkType.info)) {
+                                       // TODO enrich UI based on info
+                               } else if (isDbk(child, DbkType.title)) {
+                                       // already managed
+                               } else if (isDbk(child, para)) {
+                                       sectionPart = newParagraph(textSection, child);
+                               } else if (isDbk(child, DbkType.section)) {
+                                       sectionPart = newSectionPart(textSection, child);
+//                                     if (sectionPart == null)
+//                                             throw new IllegalArgumentException("Unsupported node " + child);
+                                       // TODO list node types in exception
+                               } else {
+                                       throw new IllegalArgumentException("Unsupported node type for " + child);
+                               }
+                               if (sectionPart != null && sectionPart instanceof Control)
+                                       ((Control) sectionPart).setLayoutData(CmsSwtUtils.fillWidth());
+                       }
+
+//                     if (!flat)
+                       for (NodeIterator ni = section.getNode().getNodes(DbkType.section.get()); ni.hasNext();) {
+                               Node child = ni.nextNode();
+                               if (isDbk(child, DbkType.section)) {
+                                       TextSection newSection = newTextSection(section, child);
+                                       newSection.setLayoutData(CmsSwtUtils.fillWidth());
+                                       refresh(newSection);
+                               }
+                       }
+               } else {
+                       for (Section s : section.getSubSections().values())
+                               refresh(s);
+               }
+               // section.layout(true, true);
+               long duration = System.currentTimeMillis() - begin;
+//             System.out.println(duration + " ms - " + DbkUtils.getTitle(section.getNode()));
+       }
+
+       /** To be overridden in order to provide additional SectionPart types */
+       protected TextSection newTextSection(Section section, Node node) {
+               return new TextSection(section, SWT.NONE, node);
+       }
+
+       /** To be overridden in order to provide additional SectionPart types */
+       protected SectionPart newSectionPart(TextSection textSection, Node node) {
+               return null;
+       }
+
+       // CRUD
+       protected Paragraph newParagraph(TextSection parent, Node node) throws RepositoryException {
+               Paragraph paragraph = new Paragraph(parent, parent.getStyle(), node);
+               updateContent(paragraph);
+               paragraph.setLayoutData(CmsSwtUtils.fillWidth());
+               paragraph.setMouseListener(getMouseListener());
+               paragraph.setFocusListener(getFocusListener());
+               return paragraph;
+       }
+
+       protected DbkImg newImg(TextSection parent, Node node) {
+               try {
+                       DbkImg img = new DbkImg(parent, parent.getStyle(), node, imageManager);
+                       GridData imgGd;
+                       if (maxMediaWidth != null) {
+                               imgGd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+                               imgGd.widthHint = maxMediaWidth;
+                               img.setPreferredSize(new Cms2DSize(maxMediaWidth, 0));
+                       } else {
+                               imgGd = CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT);
+                       }
+                       img.setLayoutData(imgGd);
+                       updateContent(img);
+                       img.setMouseListener(getMouseListener());
+                       img.setFocusListener(getFocusListener());
+                       return img;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add new image " + node, e);
+               }
+       }
+
+       protected DbkVideo newVideo(TextSection parent, Node node) {
+               try {
+                       DbkVideo video = new DbkVideo(parent, getCmsEditable().canEdit() ? SWT.NONE : SWT.READ_ONLY, node);
+                       GridData gd;
+                       if (maxMediaWidth != null) {
+                               gd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+                               // TODO, manage size
+//                             gd.widthHint = maxMediaWidth;
+//                             gd.heightHint = (int) (gd.heightHint * 0.5625);
+                       } else {
+                               gd = new GridData(SWT.CENTER, SWT.FILL, false, false);
+//                             gd.widthHint = video.getWidth();
+//                             gd.heightHint = video.getHeight();
+                       }
+                       video.setLayoutData(gd);
+                       updateContent(video);
+                       return video;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add new image " + node, e);
+               }
+       }
+
+       protected DbkSectionTitle newSectionTitle(TextSection parent, Node titleNode) throws RepositoryException {
+               int style = parent.getStyle();
+               Composite titleParent = newSectionHeader(parent);
+               if (parent.isTitleReadOnly())
+                       style = style | SWT.READ_ONLY;
+               DbkSectionTitle title = new DbkSectionTitle(titleParent, style, titleNode);
+               updateContent(title);
+               title.setMouseListener(getMouseListener());
+               title.setFocusListener(getFocusListener());
+               return title;
+       }
+
+       /**
+        * To be overridden in order to provide additional processing at the section
+        * level.
+        * 
+        * @return the parent to use for the {@link DbkSectionTitle}, by default
+        *         {@link Section#getHeader()}
+        */
+       protected Composite newSectionHeader(TextSection section) {
+               return section.getHeader();
+       }
+
+       protected DbkSectionTitle prepareSectionTitle(Section newSection, String titleText) throws RepositoryException {
+               Node sectionNode = newSection.getNode();
+               Node titleNode = DbkJcrUtils.getOrAddDbk(sectionNode, DbkType.title);
+               getTextInterpreter().write(titleNode, titleText);
+               if (newSection.getHeader() == null)
+                       newSection.createHeader();
+               DbkSectionTitle sectionTitle = newSectionTitle((TextSection) newSection, sectionNode);
+               return sectionTitle;
+       }
+
+       protected void updateContent(SwtEditablePart part) throws RepositoryException {
+               if (part instanceof SectionPart) {
+                       SectionPart sectionPart = (SectionPart) part;
+                       Node partNode = sectionPart.getNode();
+
+                       if (part instanceof StyledControl && (sectionPart.getSection() instanceof TextSection)) {
+                               TextSection section = (TextSection) sectionPart.getSection();
+                               StyledControl styledControl = (StyledControl) part;
+                               if (isDbk(partNode, para)) {
+                                       String style = partNode.hasProperty(DbkAttr.role.name())
+                                                       ? partNode.getProperty(DbkAttr.role.name()).getString()
+                                                       : section.getDefaultTextStyle();
+                                       styledControl.setStyle(style);
+                               }
+                       }
+                       // use control AFTER setting style, since it may have been reset
+
+                       if (part instanceof EditableText) {
+                               EditableText paragraph = (EditableText) part;
+                               if (paragraph == getEdited())
+                                       paragraph.setText(textInterpreter.raw(partNode));
+                               else
+                                       paragraph.setText(textInterpreter.readSimpleHtml(partNode));
+                       } else if (part instanceof DbkImg) {
+                               DbkImg editableImage = (DbkImg) part;
+                               // imageManager.load(partNode, part.getControl(),
+                               // editableImage.getPreferredImageSize());
+                       } else if (part instanceof DbkVideo) {
+                               DbkVideo video = (DbkVideo) part;
+                               video.load(part.getControl());
+                       }
+               } else if (part instanceof DbkSectionTitle) {
+                       DbkSectionTitle title = (DbkSectionTitle) part;
+                       title.setStyle(title.getSection().getTitleStyle());
+                       // use control AFTER setting style
+                       if (title == getEdited())
+                               title.setText(textInterpreter.read(title.getNode()));
+                       else
+                               title.setText(textInterpreter.readSimpleHtml(title.getNode()));
+               }
+       }
+
+       // OVERRIDDEN FROM PARENT VIEWER
+       @Override
+       protected void save(SwtEditablePart part) throws RepositoryException {
+               if (part instanceof EditableText) {
+                       EditableText et = (EditableText) part;
+                       if (!et.getEditable())
+                               return;
+                       String text = ((Text) et.getControl()).getText();
+
+                       // String[] lines = text.split("[\r\n]+");
+                       String[] lines = { text };
+                       assert lines.length != 0;
+                       saveLine(part, lines[0]);
+                       if (lines.length > 1) {
+                               ArrayList<Control> toLayout = new ArrayList<Control>();
+                               if (part instanceof Paragraph) {
+                                       Paragraph currentParagraph = (Paragraph) et;
+                                       Section section = currentParagraph.getSection();
+                                       Node sectionNode = section.getNode();
+                                       Node currentParagraphN = currentParagraph.getNode();
+                                       for (int i = 1; i < lines.length; i++) {
+                                               Node newNode = addDbk(sectionNode, para);
+                                               // newNode.addMixin(CmsTypes.CMS_STYLED);
+                                               saveLine(newNode, lines[i]);
+                                               // second node was create as last, if it is not the next
+                                               // one, it
+                                               // means there are some in between and we can take the
+                                               // one at
+                                               // index+1 for the re-order
+                                               if (newNode.getIndex() > currentParagraphN.getIndex() + 1) {
+                                                       sectionNode.orderBefore(p(newNode.getIndex()), p(currentParagraphN.getIndex() + 1));
+                                               }
+                                               Paragraph newParagraph = newParagraph((TextSection) section, newNode);
+                                               newParagraph.moveBelow(currentParagraph);
+                                               toLayout.add(newParagraph);
+
+                                               currentParagraph = newParagraph;
+                                               currentParagraphN = newNode;
+                                       }
+                               }
+                               // TODO or rather return the created paragraphs?
+                               layout(toLayout.toArray(new Control[toLayout.size()]));
+                       }
+                       persistChanges(et.getNode());
+               }
+       }
+
+       protected void saveLine(SwtEditablePart part, String line) {
+               if (part instanceof NodePart) {
+                       saveLine(((NodePart) part).getNode(), line);
+               } else if (part instanceof PropertyPart) {
+                       saveLine(((PropertyPart) part).getProperty(), line);
+               } else {
+                       throw new IllegalArgumentException("Unsupported part " + part);
+               }
+       }
+
+       protected void saveLine(Item item, String line) {
+               line = line.trim();
+               textInterpreter.write(item, line);
+       }
+
+       @Override
+       protected void prepare(SwtEditablePart part, Object caretPosition) {
+               Control control = part.getControl();
+               if (control instanceof Text) {
+                       Text text = (Text) control;
+                       if (caretPosition != null)
+                               if (caretPosition instanceof Integer)
+                                       text.setSelection((Integer) caretPosition);
+                               else if (caretPosition instanceof Point) {
+//                                     layout(text);
+//                                     // TODO find a way to position the caret at the right place
+//                                     Point clickLocation = (Point) caretPosition;
+//                                     Point withinText = text.toControl(clickLocation);
+//                                     Rectangle bounds = text.getBounds();
+//                                     int width = bounds.width;
+//                                     int height = bounds.height;
+//                                     int textLength = text.getText().length();
+//                                     float area = width * height;
+//                                     float proportion = withinText.y * width + withinText.x;
+//                                     int pos = (int) (textLength * (proportion / area));
+//                                     text.setSelection(pos);
+                               }
+                       text.setData(RWT.ACTIVE_KEYS, new String[] { "BACKSPACE", "ESC", "TAB", "SHIFT+TAB", "ALT+ARROW_LEFT",
+                                       "ALT+ARROW_RIGHT", "ALT+ARROW_UP", "ALT+ARROW_DOWN", "RETURN", "CTRL+RETURN", "ENTER", "DELETE" });
+                       text.setData(RWT.CANCEL_KEYS, new String[] { "RETURN", "ALT+ARROW_LEFT", "ALT+ARROW_RIGHT" });
+                       text.addKeyListener(this);
+               } else if (part instanceof DbkImg) {
+                       ((DbkImg) part).setFileUploadListener(fileUploadListener);
+               }
+       }
+
+       // REQUIRED BY CONTEXT MENU
+       void setParagraphStyle(Paragraph paragraph, String style) {
+               try {
+                       Node paragraphNode = paragraph.getNode();
+                       if (style == null) {// default
+                               if (paragraphNode.hasProperty(DbkAttr.role.name()))
+                                       paragraphNode.getProperty(DbkAttr.role.name()).remove();
+                       } else {
+                               paragraphNode.setProperty(DbkAttr.role.name(), style);
+                       }
+                       persistChanges(paragraphNode);
+                       updateContent(paragraph);
+                       layoutPage();
+               } catch (RepositoryException e1) {
+                       throw new JcrException("Cannot set style " + style + " on " + paragraph, e1);
+               }
+       }
+
+       SectionPart insertPart(Section section, Node node) {
+               try {
+                       refresh(section);
+                       layoutPage();
+                       for (Control control : section.getChildren()) {
+                               if (control instanceof SectionPart) {
+                                       SectionPart sectionPart = (SectionPart) control;
+                                       Node partNode = sectionPart.getNode();
+                                       if (partNode.getPath().equals(node.getPath()))
+                                               return sectionPart;
+                               }
+                       }
+                       throw new IllegalStateException("New section part " + node + "not found");
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot insert part " + node + " in section " + section.getNode(), e);
+               }
+       }
+
+       void addParagraph(SectionPart partBefore, String txt) {
+               Section section = partBefore.getSection();
+               SectionPart nextSectionPart = section.nextSectionPart(partBefore);
+               Node newNode = addDbk(section.getNode(), para);
+               textInterpreter.write(newNode, txt != null ? txt : "");
+               if (nextSectionPart != null) {
+                       try {
+                               Node nextNode = nextSectionPart.getNode();
+                               section.getNode().orderBefore(Jcr.getIndexedName(newNode), Jcr.getIndexedName(nextNode));
+                       } catch (RepositoryException e) {
+                               throw new JcrException("Cannot order " + newNode + " before " + nextSectionPart.getNode(), e);
+                       }
+               }
+               Jcr.save(newNode);
+               Paragraph paragraph = (Paragraph) insertPart(partBefore.getSection(), newNode);
+               edit(paragraph, 0);
+       }
+
+       void deletePart(SectionPart sectionPart) {
+               try {
+                       Node node = sectionPart.getNode();
+                       Session session = node.getSession();
+                       if (sectionPart instanceof DbkImg) {
+                               if (!isDbk(node, DbkType.mediaobject))
+                                       throw new IllegalArgumentException("Node " + node + " is not a media object.");
+                       }
+                       node.remove();
+                       session.save();
+                       if (sectionPart instanceof Control)
+                               ((Control) sectionPart).dispose();
+                       layoutPage();
+               } catch (RepositoryException e1) {
+                       throw new JcrException("Cannot delete " + sectionPart, e1);
+               }
+       }
+
+       void deleteSection(Section section) {
+               try {
+                       Node node = section.getNode();
+                       Session session = node.getSession();
+                       node.remove();
+                       session.save();
+                       section.dispose();
+                       layoutPage();
+               } catch (RepositoryException e1) {
+                       throw new JcrException("Cannot delete " + section, e1);
+               }
+       }
+
+       String getRawParagraphText(Paragraph paragraph) {
+               return textInterpreter.raw(paragraph.getNode());
+       }
+
+       // COMMANDS
+       protected void splitEdit() {
+               checkEdited();
+               try {
+                       if (getEdited() instanceof Paragraph) {
+                               Paragraph paragraph = (Paragraph) getEdited();
+                               Text text = (Text) paragraph.getControl();
+                               int caretPosition = text.getCaretPosition();
+                               String txt = text.getText();
+                               String first = txt.substring(0, caretPosition);
+                               String second = txt.substring(caretPosition);
+                               Node firstNode = paragraph.getNode();
+                               Node sectionNode = firstNode.getParent();
+
+                               // FIXME set content the DocBook way
+                               // firstNode.setProperty(CMS_CONTENT, first);
+                               Node secondNode = addDbk(sectionNode, para);
+                               // secondNode.addMixin(CmsTypes.CMS_STYLED);
+
+                               // second node was create as last, if it is not the next one, it
+                               // means there are some in between and we can take the one at
+                               // index+1 for the re-order
+                               if (secondNode.getIndex() > firstNode.getIndex() + 1) {
+                                       sectionNode.orderBefore(p(secondNode.getIndex()), p(firstNode.getIndex() + 1));
+                               }
+
+                               // if we die in between, at least we still have the whole text
+                               // in the first node
+                               try {
+                                       textInterpreter.write(secondNode, second);
+                                       textInterpreter.write(firstNode, first);
+                               } catch (Exception e) {
+                                       // so that no additional nodes are created:
+                                       JcrUtils.discardUnderlyingSessionQuietly(firstNode);
+                                       throw e;
+                               }
+
+                               persistChanges(firstNode);
+
+                               Paragraph secondParagraph = paragraphSplitted(paragraph, secondNode);
+                               edit(secondParagraph, 0);
+                       } else if (getEdited() instanceof DbkSectionTitle) {
+                               DbkSectionTitle sectionTitle = (DbkSectionTitle) getEdited();
+                               Text text = (Text) sectionTitle.getControl();
+                               String txt = text.getText();
+                               int caretPosition = text.getCaretPosition();
+                               Section section = sectionTitle.getSection();
+                               Node sectionNode = section.getNode();
+                               Node paragraphNode = addDbk(sectionNode, para);
+                               // paragraphNode.addMixin(CmsTypes.CMS_STYLED);
+
+                               textInterpreter.write(paragraphNode, txt.substring(caretPosition));
+                               textInterpreter.write(sectionNode.getNode(DbkType.title.get()), txt.substring(0, caretPosition));
+                               sectionNode.orderBefore(p(paragraphNode.getIndex()), p(1));
+                               persistChanges(sectionNode);
+
+                               Paragraph paragraph = sectionTitleSplitted(sectionTitle, paragraphNode);
+                               // section.layout();
+                               edit(paragraph, 0);
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot split " + getEdited(), e);
+               }
+       }
+
+       protected void mergeWithPrevious() {
+               checkEdited();
+               try {
+                       Paragraph paragraph = (Paragraph) getEdited();
+                       Text text = (Text) paragraph.getControl();
+                       String txt = text.getText();
+                       Node paragraphNode = paragraph.getNode();
+                       if (paragraphNode.getIndex() == 1)
+                               return;// do nothing
+                       Node sectionNode = paragraphNode.getParent();
+                       Node previousNode = sectionNode.getNode(p(paragraphNode.getIndex() - 1));
+                       String previousTxt = textInterpreter.read(previousNode);
+                       textInterpreter.write(previousNode, previousTxt + txt);
+                       paragraphNode.remove();
+                       persistChanges(sectionNode);
+
+                       Paragraph previousParagraph = paragraphMergedWithPrevious(paragraph, previousNode);
+                       edit(previousParagraph, previousTxt.length());
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot stop editing", e);
+               }
+       }
+
+       protected void mergeWithNext() {
+               checkEdited();
+               try {
+                       Paragraph paragraph = (Paragraph) getEdited();
+                       Text text = (Text) paragraph.getControl();
+                       String txt = text.getText();
+                       Node paragraphNode = paragraph.getNode();
+                       Node sectionNode = paragraphNode.getParent();
+                       NodeIterator paragraphNodes = sectionNode.getNodes(DbkType.para.get());
+                       long size = paragraphNodes.getSize();
+                       if (paragraphNode.getIndex() == size)
+                               return;// do nothing
+                       Node nextNode = sectionNode.getNode(p(paragraphNode.getIndex() + 1));
+                       String nextTxt = textInterpreter.read(nextNode);
+                       textInterpreter.write(paragraphNode, txt + nextTxt);
+
+                       Section section = paragraph.getSection();
+                       Paragraph removed = (Paragraph) section.getSectionPart(nextNode.getIdentifier());
+
+                       nextNode.remove();
+                       persistChanges(sectionNode);
+
+                       paragraphMergedWithNext(paragraph, removed);
+                       edit(paragraph, txt.length());
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot stop editing", e);
+               }
+       }
+
+       protected synchronized void upload(SwtEditablePart part) {
+               try {
+                       if (part instanceof SectionPart) {
+                               SectionPart sectionPart = (SectionPart) part;
+                               Node partNode = sectionPart.getNode();
+                               int partIndex = partNode.getIndex();
+                               Section section = sectionPart.getSection();
+                               Node sectionNode = section.getNode();
+
+                               if (part instanceof Paragraph) {
+                                       // FIXME adapt to DocBook
+//                                     Node newNode = sectionNode.addNode(DocBookNames.DBK_MEDIAOBJECT, NodeType.NT_FILE);
+//                                     newNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE);
+//                                     JcrUtils.copyBytesAsFile(sectionNode, p(newNode.getIndex()), new byte[0]);
+//                                     if (partIndex < newNode.getIndex() - 1) {
+//                                             // was not last
+//                                             sectionNode.orderBefore(p(newNode.getIndex()), p(partIndex - 1));
+//                                     }
+//                                     // sectionNode.orderBefore(p(partNode.getIndex()),
+//                                     // p(newNode.getIndex()));
+//                                     persistChanges(sectionNode);
+//                                     DbkImg img = newImg((TextSection) section, newNode);
+//                                     edit(img, null);
+//                                     layout(img.getControl());
+                               } else if (part instanceof DbkImg) {
+                                       if (getEdited() == part)
+                                               return;
+                                       edit(part, null);
+                                       layoutPage();
+                               }
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot upload", e);
+               }
+       }
+
+       protected void deepen() {
+               if (flat)
+                       return;
+               checkEdited();
+               try {
+                       if (getEdited() instanceof Paragraph) {
+                               Paragraph paragraph = (Paragraph) getEdited();
+                               Text text = (Text) paragraph.getControl();
+                               String txt = text.getText();
+                               Node paragraphNode = paragraph.getNode();
+                               Section section = paragraph.getSection();
+                               Node sectionNode = section.getNode();
+                               // main title
+                               if (section == mainSection && section instanceof TextSection && paragraphNode.getIndex() == 1
+                                               && !sectionNode.hasNode(DbkType.title.get())) {
+                                       DbkSectionTitle sectionTitle = prepareSectionTitle(section, txt);
+                                       edit(sectionTitle, 0);
+                                       return;
+                               }
+                               Node newSectionNode = addDbk(sectionNode, DbkType.section);
+                               // newSectionNode.addMixin(NodeType.MIX_TITLE);
+                               sectionNode.orderBefore(h(newSectionNode.getIndex()), h(1));
+
+                               int paragraphIndex = paragraphNode.getIndex();
+                               String sectionPath = sectionNode.getPath();
+                               String newSectionPath = newSectionNode.getPath();
+                               while (sectionNode.hasNode(p(paragraphIndex + 1))) {
+                                       Node parag = sectionNode.getNode(p(paragraphIndex + 1));
+                                       sectionNode.getSession().move(sectionPath + '/' + p(paragraphIndex + 1),
+                                                       newSectionPath + '/' + DbkType.para.get());
+                                       SectionPart sp = section.getSectionPart(parag.getIdentifier());
+                                       if (sp instanceof Control)
+                                               ((Control) sp).dispose();
+                               }
+                               // create title
+                               Node titleNode = DbkJcrUtils.addDbk(newSectionNode, DbkType.title);
+                               // newSectionNode.addNode(DocBookType.TITLE, DocBookType.TITLE);
+                               getTextInterpreter().write(titleNode, txt);
+
+                               TextSection newSection = new TextSection(section, section.getStyle(), newSectionNode);
+                               newSection.setLayoutData(CmsSwtUtils.fillWidth());
+                               newSection.moveBelow(paragraph);
+
+                               // dispose
+                               paragraphNode.remove();
+                               paragraph.dispose();
+
+                               refresh(newSection);
+                               newSection.getParent().layout();
+                               layout(newSection);
+                               persistChanges(sectionNode);
+                       } else if (getEdited() instanceof DbkSectionTitle) {
+                               DbkSectionTitle sectionTitle = (DbkSectionTitle) getEdited();
+                               Section section = sectionTitle.getSection();
+                               Section parentSection = section.getParentSection();
+                               if (parentSection == null)
+                                       return;// cannot deepen main section
+                               Node sectionN = section.getNode();
+                               Node parentSectionN = parentSection.getNode();
+                               if (sectionN.getIndex() == 1)
+                                       return;// cannot deepen first section
+                               Node previousSectionN = parentSectionN.getNode(h(sectionN.getIndex() - 1));
+                               NodeIterator subSections = previousSectionN.getNodes(DbkType.section.get());
+                               int subsectionsCount = (int) subSections.getSize();
+                               previousSectionN.getSession().move(sectionN.getPath(),
+                                               previousSectionN.getPath() + "/" + h(subsectionsCount + 1));
+                               section.dispose();
+                               TextSection newSection = new TextSection(section, section.getStyle(), sectionN);
+                               refresh(newSection);
+                               persistChanges(previousSectionN);
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot deepen " + getEdited(), e);
+               }
+       }
+
+       protected void undeepen() {
+               if (flat)
+                       return;
+               checkEdited();
+               try {
+                       if (getEdited() instanceof Paragraph) {
+                               upload(getEdited());
+                       } else if (getEdited() instanceof DbkSectionTitle) {
+                               DbkSectionTitle sectionTitle = (DbkSectionTitle) getEdited();
+                               Section section = sectionTitle.getSection();
+                               Node sectionNode = section.getNode();
+                               Section parentSection = section.getParentSection();
+                               if (parentSection == null)
+                                       return;// cannot undeepen main section
+
+                               // choose in which section to merge
+                               Section mergedSection;
+                               if (sectionNode.getIndex() == 1)
+                                       mergedSection = section.getParentSection();
+                               else {
+                                       Map<String, Section> parentSubsections = parentSection.getSubSections();
+                                       ArrayList<Section> lst = new ArrayList<Section>(parentSubsections.values());
+                                       mergedSection = lst.get(sectionNode.getIndex() - 1);
+                               }
+                               Node mergedNode = mergedSection.getNode();
+                               boolean mergedHasSubSections = mergedNode.hasNode(DbkType.section.get());
+
+                               // title as paragraph
+                               Node newParagrapheNode = addDbk(mergedNode, para);
+                               // newParagrapheNode.addMixin(CmsTypes.CMS_STYLED);
+                               if (mergedHasSubSections)
+                                       mergedNode.orderBefore(p(newParagrapheNode.getIndex()), h(1));
+                               String txt = getTextInterpreter().read(sectionNode.getNode(DbkType.title.get()));
+                               getTextInterpreter().write(newParagrapheNode, txt);
+                               // move
+                               NodeIterator paragraphs = sectionNode.getNodes(para.get());
+                               while (paragraphs.hasNext()) {
+                                       Node p = paragraphs.nextNode();
+                                       SectionPart sp = section.getSectionPart(p.getIdentifier());
+                                       if (sp instanceof Control)
+                                               ((Control) sp).dispose();
+                                       mergedNode.getSession().move(p.getPath(), mergedNode.getPath() + '/' + para.get());
+                                       if (mergedHasSubSections)
+                                               mergedNode.orderBefore(p(p.getIndex()), h(1));
+                               }
+
+                               Iterator<Section> subsections = section.getSubSections().values().iterator();
+                               // NodeIterator sections = sectionNode.getNodes(CMS_H);
+                               while (subsections.hasNext()) {
+                                       Section subsection = subsections.next();
+                                       Node s = subsection.getNode();
+                                       mergedNode.getSession().move(s.getPath(), mergedNode.getPath() + '/' + DbkType.section.get());
+                                       subsection.dispose();
+                               }
+
+                               // remove section
+                               section.getNode().remove();
+                               section.dispose();
+
+                               refresh(mergedSection);
+                               mergedSection.getParent().layout();
+                               layout(mergedSection);
+                               persistChanges(mergedNode);
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot undeepen " + getEdited(), e);
+               }
+       }
+
+       // UI CHANGES
+       protected Paragraph paragraphSplitted(Paragraph paragraph, Node newNode) throws RepositoryException {
+               Section section = paragraph.getSection();
+               updateContent(paragraph);
+               Paragraph newParagraph = newParagraph((TextSection) section, newNode);
+               newParagraph.setLayoutData(CmsSwtUtils.fillWidth());
+               newParagraph.moveBelow(paragraph);
+               layout(paragraph.getControl(), newParagraph.getControl());
+               return newParagraph;
+       }
+
+       protected Paragraph sectionTitleSplitted(DbkSectionTitle sectionTitle, Node newNode) throws RepositoryException {
+               updateContent(sectionTitle);
+               Paragraph newParagraph = newParagraph(sectionTitle.getSection(), newNode);
+               // we assume beforeFirst is not null since there was a sectionTitle
+               newParagraph.moveBelow(sectionTitle.getSection().getHeader());
+               layout(sectionTitle.getControl(), newParagraph.getControl());
+               return newParagraph;
+       }
+
+       protected Paragraph paragraphMergedWithPrevious(Paragraph removed, Node remaining) throws RepositoryException {
+               Section section = removed.getSection();
+               removed.dispose();
+
+               Paragraph paragraph = (Paragraph) section.getSectionPart(remaining.getIdentifier());
+               updateContent(paragraph);
+               layout(paragraph.getControl());
+               return paragraph;
+       }
+
+       protected void paragraphMergedWithNext(Paragraph remaining, Paragraph removed) throws RepositoryException {
+               removed.dispose();
+               updateContent(remaining);
+               layout(remaining.getControl());
+       }
+
+       // UTILITIES
+       protected String p(Integer index) {
+               StringBuilder sb = new StringBuilder(6);
+               sb.append(para.get()).append('[').append(index).append(']');
+               return sb.toString();
+       }
+
+       protected String h(Integer index) {
+               StringBuilder sb = new StringBuilder(5);
+               sb.append(DbkType.section.get()).append('[').append(index).append(']');
+               return sb.toString();
+       }
+
+       // GETTERS / SETTERS
+       public Section getMainSection() {
+               return mainSection;
+       }
+
+       public boolean isFlat() {
+               return flat;
+       }
+
+       public TextInterpreter getTextInterpreter() {
+               return textInterpreter;
+       }
+
+       // KEY LISTENER
+       @Override
+       public void keyPressed(KeyEvent ke) {
+               if (log.isTraceEnabled())
+                       log.trace(ke);
+
+               if (getEdited() == null)
+                       return;
+               boolean altPressed = (ke.stateMask & SWT.ALT) != 0;
+               boolean shiftPressed = (ke.stateMask & SWT.SHIFT) != 0;
+               boolean ctrlPressed = (ke.stateMask & SWT.CTRL) != 0;
+
+               try {
+                       // Common
+                       if (ke.keyCode == SWT.ESC) {
+//                             cancelEdit();
+                               saveEdit();
+                       } else if (ke.character == '\r') {
+                               if (!shiftPressed)
+                                       splitEdit();
+                       } else if (ke.character == 'z') {
+                               if (ctrlPressed)
+                                       cancelEdit();
+                       } else if (ke.character == 'S') {
+                               if (ctrlPressed)
+                                       saveEdit();
+                       } else if (ke.character == '\t') {
+                               if (!shiftPressed) {
+                                       deepen();
+                               } else if (shiftPressed) {
+                                       undeepen();
+                               }
+                       } else {
+                               if (getEdited() instanceof Paragraph) {
+                                       Paragraph paragraph = (Paragraph) getEdited();
+                                       Section section = paragraph.getSection();
+                                       if (altPressed && ke.keyCode == SWT.ARROW_RIGHT) {
+                                               edit(section.nextSectionPart(paragraph), 0);
+                                       } else if (altPressed && ke.keyCode == SWT.ARROW_LEFT) {
+                                               edit(section.previousSectionPart(paragraph), 0);
+                                       } else if (ke.character == SWT.BS) {
+                                               Text text = (Text) paragraph.getControl();
+                                               int caretPosition = text.getCaretPosition();
+                                               if (caretPosition == 0) {
+                                                       mergeWithPrevious();
+                                               }
+                                       } else if (ke.character == SWT.DEL) {
+                                               Text text = (Text) paragraph.getControl();
+                                               int caretPosition = text.getCaretPosition();
+                                               int charcount = text.getCharCount();
+                                               if (caretPosition == charcount) {
+                                                       mergeWithNext();
+                                               }
+                                       }
+                               }
+                       }
+               } catch (Exception e) {
+                       ke.doit = false;
+                       notifyEditionException(e);
+               }
+       }
+
+       @Override
+       public void keyReleased(KeyEvent e) {
+       }
+
+       // MOUSE LISTENER
+       @Override
+       protected MouseListener createMouseListener() {
+               return new ML();
+       }
+
+       private class ML extends MouseAdapter {
+               private static final long serialVersionUID = 8526890859876770905L;
+
+               @Override
+               public void mouseDoubleClick(MouseEvent e) {
+                       if (e.button == 1) {
+                               Control source = (Control) e.getSource();
+                               SwtEditablePart composite = findDataParent(source);
+                               Point point = new Point(e.x, e.y);
+                               if (composite instanceof DbkImg) {
+                                       if (getCmsEditable().canEdit()) {
+                                               if (getCmsEditable().isEditing() && !(getEdited() instanceof DbkImg)) {
+                                                       if (source == mainSection)
+                                                               return;
+                                                       SwtEditablePart part = findDataParent(source);
+                                                       upload(part);
+                                               } else {
+                                                       getCmsEditable().startEditing();
+                                               }
+                                       }
+                               } else if (source instanceof Label) {
+                                       Label lbl = (Label) source;
+                                       Rectangle bounds = lbl.getBounds();
+                                       float width = bounds.width;
+                                       float height = bounds.height;
+                                       float textLength = lbl.getText().length();
+                                       float area = width * height;
+                                       float charArea = area / textLength;
+                                       float lines = textLength / width;
+                                       float proportion = point.y * width + point.x;
+                                       int pos = (int) (textLength * (proportion / area));
+                                       // TODO refine it
+                                       edit(composite, (Integer) pos);
+                               } else {
+                                       edit(composite, source.toDisplay(point));
+                               }
+                       }
+               }
+
+               @Override
+               public void mouseDown(MouseEvent e) {
+                       if (getCmsEditable().isEditing()) {
+                               if (e.button == 3) {
+                                       SwtEditablePart composite = findDataParent((Control) e.getSource());
+                                       if (styledTools != null) {
+                                               List<String> styles = getAvailableStyles(composite);
+                                               styledTools.show(composite, new Point(e.x, e.y), styles);
+                                       }
+                               }
+                       }
+               }
+
+               @Override
+               public void mouseUp(MouseEvent e) {
+               }
+       }
+
+       protected List<String> getAvailableStyles(SwtEditablePart editablePart) {
+               return new ArrayList<>();
+       }
+
+       public void setMaxMediaWidth(Integer maxMediaWidth) {
+               this.maxMediaWidth = maxMediaWidth;
+       }
+
+       public void setShowMainTitle(boolean showMainTitle) {
+               this.showMainTitle = showMainTitle;
+       }
+
+       public String getDefaultSectionStyle() {
+               return defaultSectionStyle;
+       }
+
+       public void setDefaultSectionStyle(String defaultSectionStyle) {
+               this.defaultSectionStyle = defaultSectionStyle;
+       }
+
+       // FILE UPLOAD LISTENER
+       private class FUL implements FileUploadListener {
+               public void uploadProgress(FileUploadEvent event) {
+                       // TODO Monitor upload progress
+               }
+
+               public void uploadFailed(FileUploadEvent event) {
+                       throw new RuntimeException("Upload failed " + event, event.getException());
+               }
+
+               public void uploadFinished(FileUploadEvent event) {
+                       for (FileDetails file : event.getFileDetails()) {
+                               if (log.isDebugEnabled())
+                                       log.debug("Received: " + file.getFileName());
+                       }
+                       mainSection.getDisplay().syncExec(new Runnable() {
+                               @Override
+                               public void run() {
+                                       saveEdit();
+                               }
+                       });
+                       FileUploadHandler uploadHandler = (FileUploadHandler) event.getSource();
+                       uploadHandler.dispose();
+               }
+       }
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/CustomDbkEditor.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/CustomDbkEditor.java
new file mode 100644 (file)
index 0000000..365a5a1
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Node;
+
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.cms.ui.viewers.Section;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Manages hardcoded sections as an arbitrary hierarchy under the main section,
+ * which contains no text and no title.
+ */
+public class CustomDbkEditor extends AbstractDbkViewer {
+       private static final long serialVersionUID = 656302500183820802L;
+
+       public CustomDbkEditor(Composite parent, int style, Node textNode, CmsEditable cmsEditable) {
+               this(new Section(parent, style, textNode), style, cmsEditable);
+       }
+
+       public CustomDbkEditor(Section parent, int style, CmsEditable cmsEditable) {
+               super(parent, style, cmsEditable);
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkContextMenu.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkContextMenu.java
new file mode 100644 (file)
index 0000000..89b5493
--- /dev/null
@@ -0,0 +1,230 @@
+package org.argeo.app.ui.docbook;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Node;
+
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.app.docbook.DbkMsg;
+import org.argeo.app.jcr.docbook.DbkJcrUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.MouseDown;
+import org.argeo.cms.ui.viewers.NodePart;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.cms.ui.viewers.SectionPart;
+import org.argeo.cms.ui.widgets.EditableText;
+import org.argeo.cms.ui.widgets.Img;
+import org.argeo.jcr.Jcr;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/** Dialog to edit a text part. */
+class DbkContextMenu {
+       private final AbstractDbkViewer textViewer;
+
+       private Shell shell;
+
+       DbkContextMenu(AbstractDbkViewer textViewer, Shell parentShell) {
+//             shell = new Shell(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+               shell = new Shell(parentShell, SWT.BORDER);
+//             super(display, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+               this.textViewer = textViewer;
+               shell.setLayout(new GridLayout());
+               // shell.setData(RWT.CUSTOM_VARIANT, TEXT_STYLED_TOOLS_DIALOG);
+
+               shell.addShellListener(new ToolsShellListener());
+       }
+
+       void show(SwtEditablePart editablePart, Point location, List<String> availableStyles) {
+               if (shell.isVisible())
+                       shell.setVisible(false);
+               CmsSwtUtils.clear(shell);
+               Composite parent = shell;
+               CmsEditable cmsEditable = textViewer.getCmsEditable();
+//             if (availableStyles.isEmpty())
+//                     return;
+
+               if (editablePart instanceof Paragraph) {
+                       Paragraph paragraph = (Paragraph) editablePart;
+                       deletePartB(parent, DbkMsg.deleteParagraph.lead(), paragraph);
+                       insertMediaB(parent,  paragraph);
+
+               } else if (editablePart instanceof Img) {
+                       Img img = (Img) editablePart;
+                       deletePartB(parent, DbkMsg.deleteMedia.lead(), img);
+                       insertMediaB(parent, img);
+                       insertParagraphB(parent, DbkMsg.insertParagraph.lead(), img);
+
+               } else if (editablePart instanceof DbkSectionTitle) {
+                       DbkSectionTitle sectionTitle = (DbkSectionTitle) editablePart;
+                       TextSection section = sectionTitle.getSection();
+                       if (!section.isTitleReadOnly()) {
+                               Label deleteB = new Label(shell, SWT.NONE);
+                               deleteB.setText(DbkMsg.deleteSection.lead());
+                               deleteB.addMouseListener((MouseDown) (e) -> {
+                                       textViewer.deleteSection(section);
+                                       hide();
+                               });
+                       }
+                       insertMediaB(parent,  sectionTitle.getSection(), sectionTitle);
+               }
+
+               StyledToolMouseListener stml = new StyledToolMouseListener(editablePart);
+               List<StyleButton> styleButtons = new ArrayList<DbkContextMenu.StyleButton>();
+               if (cmsEditable.isEditing()) {
+                       for (String style : availableStyles) {
+                               StyleButton styleButton = new StyleButton(shell, SWT.WRAP);
+                               if (!"".equals(style))
+                                       styleButton.setStyle(style);
+                               else
+                                       styleButton.setStyle(null);
+                               styleButton.setMouseListener(stml);
+                               styleButtons.add(styleButton);
+                       }
+               } else if (cmsEditable.canEdit()) {
+                       // Edit
+//                     Label editButton = new Label(shell, SWT.NONE);
+//                     editButton.setText("Edit");
+//                     editButton.addMouseListener(stml);
+               }
+
+               if (editablePart instanceof Paragraph) {
+                       final int size = 32;
+                       String text = textViewer.getRawParagraphText((Paragraph) editablePart);
+                       String textToShow = text.length() > size ? text.substring(0, size - 3) + "..." : text;
+                       for (StyleButton styleButton : styleButtons) {
+                               styleButton.setText((styleButton.style == null ? "default" : styleButton.style) + " : " + textToShow);
+                       }
+               }
+
+               shell.pack();
+               shell.layout();
+               if (editablePart instanceof Control) {
+                       int height = shell.getSize().y;
+                       int parentShellHeight = shell.getShell().getSize().y;
+                       if ((location.y + height) < parentShellHeight) {
+                               shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y));
+                       } else {
+                               shell.setLocation(((Control) editablePart).toDisplay(location.x, location.y - parentShellHeight));
+                       }
+               }
+
+               if (shell.getChildren().length != 0)
+                       shell.open();
+       }
+
+       void hide() {
+               shell.setVisible(false);
+       }
+
+       protected void insertMediaB(Composite parent, SectionPart sectionPart) {
+               insertMediaB(parent,  sectionPart.getSection(), sectionPart);
+       }
+
+       protected void insertMediaB(Composite parent, Section section, NodePart nodePart) {
+               Label insertPictureB = new Label(parent, SWT.NONE);
+               insertPictureB.setText(DbkMsg.insertPicture.lead());
+               insertPictureB.addMouseListener((MouseDown) (e) -> {
+                       Node newNode = DbkJcrUtils.insertImageAfter(nodePart.getNode());
+                       Jcr.save(newNode);
+                       textViewer.insertPart(section, newNode);
+                       hide();
+               });
+               Label insertVideoB = new Label(parent, SWT.NONE);
+               insertVideoB.setText(DbkMsg.insertVideo.lead());
+               insertVideoB.addMouseListener((MouseDown) (e) -> {
+                       Node newNode = DbkJcrUtils.insertVideoAfter(nodePart.getNode());
+                       Jcr.save(newNode);
+                       textViewer.insertPart(section, newNode);
+                       hide();
+               });
+
+       }
+
+       protected void insertParagraphB(Composite parent, String msg, SectionPart sectionPart) {
+               Label insertMediaB = new Label(parent, SWT.NONE);
+               insertMediaB.setText(msg);
+               insertMediaB.addMouseListener((MouseDown) (e) -> {
+                       textViewer.addParagraph(sectionPart, null);
+                       hide();
+               });
+       }
+
+       protected void deletePartB(Composite parent, String msg, SectionPart sectionPart) {
+               Label deleteB = new Label(shell, SWT.NONE);
+               deleteB.setText(msg);
+               deleteB.addMouseListener((MouseDown) (e) -> {
+                       textViewer.deletePart(sectionPart);
+                       hide();
+               });
+       }
+
+       class StyleButton extends EditableText {
+               private static final long serialVersionUID = 7731102609123946115L;
+
+               String style;
+
+               public StyleButton(Composite parent, int style) {
+                       super(parent, style);
+               }
+
+               @Override
+               public void setStyle(String style) {
+                       this.style = style;
+                       super.setStyle(style);
+               }
+
+//             private Label label;
+//
+//             public StyleButton(Composite parent, int swtStyle) {
+//                     super(parent, SWT.NONE);
+//                     setLayout(new GridLayout());
+//                     label = new Label(this, swtStyle);
+//             }
+//
+//             public Label getLabel() {
+//                     return label;
+//             }
+
+       }
+
+       class StyledToolMouseListener extends MouseAdapter {
+               private static final long serialVersionUID = 8516297091549329043L;
+               private SwtEditablePart editablePart;
+
+               public StyledToolMouseListener(SwtEditablePart editablePart) {
+                       super();
+                       this.editablePart = editablePart;
+               }
+
+               @Override
+               public void mouseDown(MouseEvent e) {
+                       // TODO make it more robust.
+                       Label sb = (Label) e.getSource();
+                       Object style = sb.getData(RWT.CUSTOM_VARIANT);
+                       textViewer.setParagraphStyle((Paragraph) editablePart, style == null ? null : style.toString());
+                       hide();
+               }
+       }
+
+       class ToolsShellListener extends org.eclipse.swt.events.ShellAdapter {
+               private static final long serialVersionUID = 8432350564023247241L;
+
+               @Override
+               public void shellDeactivated(ShellEvent e) {
+                       hide();
+               }
+
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImageManager.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImageManager.java
new file mode 100644 (file)
index 0000000..3136bf3
--- /dev/null
@@ -0,0 +1,175 @@
+package org.argeo.app.ui.docbook;
+
+import static javax.jcr.Node.JCR_CONTENT;
+import static javax.jcr.Property.JCR_DATA;
+import static javax.jcr.nodetype.NodeType.NT_FILE;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+
+import javax.jcr.Binary;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.api.app.EntityNames;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.ux.Cms2DSize;
+import org.argeo.api.cms.ux.CmsImageManager;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.app.jcr.docbook.DbkJcrUtils;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.util.DefaultImageManager;
+import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.swt.graphics.ImageData;
+
+/** Add DocBook images support to {@link CmsImageManager}. */
+public class DbkImageManager extends DefaultImageManager {
+       private Node baseFolder = null;
+
+       public DbkImageManager(Node baseFolder) {
+               this.baseFolder = baseFolder;
+       }
+
+       Node getImageDataNode(Node mediaObjectNode) {
+               try {
+                       if (mediaObjectNode.hasNode(DbkType.imageobject.get())) {
+                               Node imageDataNode = mediaObjectNode.getNode(DbkType.imageobject.get())
+                                               .getNode(DbkType.imagedata.get());
+                               return imageDataNode;
+                       } else {
+                               throw new IllegalStateException("No image data found for " + mediaObjectNode);
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException(e);
+               }
+       }
+
+       @Override
+       public Binary getImageBinary(Node node) {
+               Node fileNode = null;
+               if (DbkJcrUtils.isDbk(node, DbkType.mediaobject)) {
+                       Node imageDataNode = getImageDataNode(node);
+                       fileNode = getFileNode(imageDataNode);
+               }
+               try {
+                       if (node.isNodeType(NT_FILE)) {
+                               fileNode = node;
+                       }
+                       if (fileNode != null) {
+                               return node.getNode(JCR_CONTENT).getProperty(JCR_DATA).getBinary();
+                       } else {
+                               return null;
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException(e);
+               }
+       }
+
+       public Cms2DSize getImageSize(Node mediaObjectNode) {
+               Node imageDataNode = getImageDataNode(mediaObjectNode);
+               Node fileNode = getFileNode(imageDataNode);
+               if (fileNode == null)
+                       return new Cms2DSize(0, 0);
+               try {
+                       Cms2DSize intrinsicSize;
+                       if (fileNode.hasProperty(EntityNames.SVG_WIDTH) && fileNode.hasProperty(EntityNames.SVG_HEIGHT)) {
+                               int width = (int) fileNode.getProperty(EntityNames.SVG_WIDTH).getLong();
+                               int height = (int) fileNode.getProperty(EntityNames.SVG_HEIGHT).getLong();
+                               intrinsicSize = new Cms2DSize(width, height);
+                       } else {
+                               try (InputStream in = JcrUtils.getFileAsStream(fileNode)) {
+                                       ImageData id = new ImageData(in);
+                                       intrinsicSize = updateSize(fileNode, id);
+                               } catch (IOException e) {
+                                       throw new RuntimeException("Cannot load file " + fileNode, e);
+                               }
+                       }
+                       // TODO interpret image data infos
+                       return intrinsicSize;
+               } catch (RepositoryException e) {
+                       throw new JcrException(e);
+               }
+       }
+
+       protected Cms2DSize updateSize(Node fileNode, ImageData id) throws RepositoryException {
+               fileNode.addMixin(EntityType.box.get());
+               fileNode.setProperty(EntityNames.SVG_WIDTH, id.width);
+               fileNode.setProperty(EntityNames.SVG_HEIGHT, id.height);
+               return new Cms2DSize(id.width, id.height);
+       }
+
+       @Override
+       protected void processNewImageFile(Node mediaObjectNode, Node fileNode, ImageData id)
+                       throws RepositoryException, IOException {
+               Node imageDataNode = getImageDataNode(mediaObjectNode);
+               updateSize(fileNode, id);
+               String filePath = fileNode.getPath();
+               String relPath = filePath.substring(baseFolder.getPath().length() + 1);
+               imageDataNode.setProperty(DbkAttr.fileref.name(), relPath);
+       }
+
+       @Override
+       public String getImageUrl(Node mediaObjectNode) {
+               Node imageDataNode = getImageDataNode(mediaObjectNode);
+               // TODO factorise
+               String fileref = null;
+               try {
+                       if (imageDataNode.hasProperty(DbkAttr.fileref.name()))
+                               fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString();
+               } catch (RepositoryException e) {
+                       throw new JcrException(e);
+               }
+               if (fileref == null)
+                       return null;
+               URI fileUri;
+               try {
+                       // FIXME it messes up with the '/'
+                       fileUri = new URI(URLEncoder.encode(fileref, StandardCharsets.UTF_8.toString()));
+               } catch (URISyntaxException | UnsupportedEncodingException e) {
+                       throw new IllegalArgumentException("File ref in " + imageDataNode + " is badly formatted", e);
+               }
+               if (fileUri.getScheme() != null)
+                       return fileUri.toString();
+               // local
+               Node fileNode = getFileNode(imageDataNode);
+               String url = CmsUiUtils.getDataPathForUrl(fileNode);
+               return url;
+       }
+
+       protected Node getFileNode(Node imageDataNode) {
+               // FIXME make URL use case more robust
+               try {
+                       String fileref = null;
+                       if (imageDataNode.hasProperty(DbkAttr.fileref.name()))
+                               fileref = imageDataNode.getProperty(DbkAttr.fileref.name()).getString();
+                       if (fileref == null)
+                               return null;
+                       Node fileNode;
+                       if (fileref.startsWith("/"))
+                               fileNode = baseFolder.getSession().getNode(fileref);
+                       else
+                               fileNode = baseFolder.getNode(fileref);
+                       return fileNode;
+               } catch (RepositoryException e) {
+                       throw new JcrException(e);
+               }
+       }
+
+       protected Node getMediaFolder() {
+               try {
+                       // TODO check edition status
+                       Node mediaFolder = JcrUtils.getOrAdd(baseFolder, EntityNames.MEDIA, NodeType.NT_FOLDER);
+                       return mediaFolder;
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot get media folder", e);
+               }
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImg.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkImg.java
new file mode 100644 (file)
index 0000000..ca9b388
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.widgets.Img;
+import org.eclipse.rap.fileupload.FileUploadEvent;
+import org.eclipse.rap.fileupload.FileUploadHandler;
+import org.eclipse.rap.fileupload.FileUploadListener;
+import org.eclipse.rap.fileupload.FileUploadReceiver;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** DocBook specific image area. */
+public class DbkImg extends Img {
+       private static final long serialVersionUID = -6150996708899219074L;
+
+       public DbkImg(Composite parent, int swtStyle, Node imgNode, DbkImageManager imageManager)
+                       throws RepositoryException {
+               super(parent, swtStyle, imgNode, imageManager);
+       }
+
+       @Override
+       protected Node getUploadFolder() {
+               Node mediaFolder = ((DbkImageManager) getImageManager()).getMediaFolder();
+               return mediaFolder;
+       }
+
+       @Override
+       protected String getUploadName() {
+               return null;
+       }
+
+       @Override
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
+       }
+
+       @Override
+       protected void setControlLayoutData(Control control) {
+               control.setLayoutData(CmsSwtUtils.grabWidth(SWT.CENTER, SWT.DEFAULT));
+       }
+
+       @Override
+       protected FileUploadHandler prepareUpload(FileUploadReceiver receiver) {
+               FileUploadHandler fileUploadHandler = super.prepareUpload(receiver);
+               fileUploadHandler.addUploadListener(new FileUploadListener() {
+
+                       @Override
+                       public void uploadProgress(FileUploadEvent event) {
+                               // TODO Auto-generated method stub
+
+                       }
+
+                       @Override
+                       public void uploadFinished(FileUploadEvent event) {
+                       }
+
+                       @Override
+                       public void uploadFailed(FileUploadEvent event) {
+                               // TODO Auto-generated method stub
+
+                       }
+               });
+               return fileUploadHandler;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkSectionTitle.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkSectionTitle.java
new file mode 100644 (file)
index 0000000..a68a39c
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.ui.viewers.NodePart;
+import org.argeo.cms.ui.widgets.EditableText;
+import org.eclipse.swt.widgets.Composite;
+
+/** The title of a section, based on an XML text node. */
+public class DbkSectionTitle extends EditableText implements SwtEditablePart, NodePart {
+       private static final long serialVersionUID = -1787983154946583171L;
+
+       private final TextSection section;
+
+       public DbkSectionTitle(Composite parent, int swtStyle, Node titleNode) throws RepositoryException {
+               super(parent, swtStyle, titleNode);
+               section = (TextSection) TextSection.findSection(this);
+       }
+
+       public TextSection getSection() {
+               return section;
+       }
+
+       @Override
+       public Node getItem() throws RepositoryException {
+               return getNode();
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkTextInterpreter.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkTextInterpreter.java
new file mode 100644 (file)
index 0000000..4875f7d
--- /dev/null
@@ -0,0 +1,280 @@
+package org.argeo.app.ui.docbook;
+
+import static org.argeo.app.docbook.DbkType.para;
+import static org.argeo.app.docbook.DbkType.title;
+import static org.argeo.app.jcr.docbook.DbkJcrUtils.isDbk;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+import javax.jcr.ImportUUIDBehavior;
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+
+/** Based on HTML with a few Wiki-like shortcuts. */
+public class DbkTextInterpreter implements TextInterpreter {
+//     private DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+
+       private String linkCssClass = DbkType.link.name();
+
+       @Override
+       public void write(Item item, String content) {
+               try {
+                       if (item instanceof Node) {
+                               Node node = (Node) item;
+                               if (isDbk(node, para) || isDbk(node, title)) {
+                                       String raw = convertToStorage(node, content);
+                                       validateBeforeStoring(raw);
+
+                                       String jcrUuid = node.getIdentifier();
+//                                     if (node.hasProperty(Property.JCR_UUID))
+//                                             jcrUuid = node.getProperty(Property.JCR_UUID).getString();
+//                                     else {
+//                                             // TODO use time based
+//                                             jcrUuid = UUID.randomUUID().toString();
+//                                             node.setProperty(Property.JCR_UUID, jcrUuid);
+//                                             node.getSession().save();
+//                                     }
+
+                                       StringBuilder namespaces = new StringBuilder();
+                                       namespaces.append(" xmlns:dbk=\"http://docbook.org/ns/docbook\"");
+                                       namespaces.append(" xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"");
+                                       namespaces.append(" xmlns:xlink=\"http://www.w3.org/1999/xlink\"");
+                                       raw = "<" + node.getName() + " jcr:uuid=\"" + jcrUuid + "\"" + namespaces + ">" + raw + "</"
+                                                       + node.getName() + ">";
+//                                     System.out.println(raw);
+                                       try (InputStream in = new ByteArrayInputStream(raw.getBytes(StandardCharsets.UTF_8))) {
+                                               node.getSession().importXML(node.getParent().getPath(), in,
+                                                               ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING);
+                                               // node.getSession().save();
+                                       } catch (IOException e) {
+                                               throw new IllegalArgumentException("Cannot parse raw content of " + node, e);
+                                       }
+
+//                                     try {
+//                                             DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
+//                                             Document document;
+//                                             try (Reader in = new StringReader(raw)) {
+//                                                     document = documentBuilder.parse(new InputSource(in));
+//                                             }
+//                                             NodeList nl = document.getChildNodes();
+//                                             for (int i = 0; i < nl.getLength(); i++) {
+//                                                     org.w3c.dom.Node n = nl.item(i);
+//                                                     if (node instanceof Text) {
+//
+//                                                     }
+//                                             }
+//                                     } catch (ParserConfigurationException | SAXException | IOException e) {
+//                                             throw new IllegalArgumentException("Cannot parse raw content of " + node, e);
+//                                     }
+
+//                                     Node jcrText;
+//                                     if (!node.hasNode(Jcr.JCR_XMLTEXT))
+//                                             jcrText = node.addNode(Jcr.JCR_XMLTEXT, JcrxType.JCRX_XMLTEXT);
+//                                     else
+//                                             jcrText = node.getNode(Jcr.JCR_XMLTEXT);
+//                                     jcrText.setProperty(Jcr.JCR_XMLCHARACTERS, raw);
+                               } else {
+                                       throw new IllegalArgumentException("Don't know how to interpret " + node);
+                               }
+                       } else {// property
+                               Property property = (Property) item;
+                               property.setValue(content);
+                       }
+                       // item.getSession().save();
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot set content on " + item, e);
+               }
+       }
+
+       @Override
+       public String read(Item item) {
+               try {
+                       String raw = raw(item);
+                       return convertFromStorage(item, raw);
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot get " + item + " for edit", e);
+               }
+       }
+
+       @Override
+       public String raw(Item item) {
+               try {
+                       item.getSession().refresh(true);
+                       if (item instanceof Node) {
+                               Node node = (Node) item;
+                               if (isDbk(node, para) || isDbk(node, title)) {
+                                       StringBuilder sb = new StringBuilder();
+                                       readXml(node, sb);
+//                                     NodeIterator nit = node.getNodes();
+//                                     while (nit.hasNext()) {
+//                                             Node child = nit.nextNode();
+//                                             if (child.getName().equals(Jcr.JCR_XMLTEXT)) {
+//                                                     Node jcrText = node.getNode(Jcr.JCR_XMLTEXT);
+//                                                     String txt = jcrText.getProperty(Jcr.JCR_XMLCHARACTERS).getString();
+//                                                     // TODO make it more robust
+//                                                     // txt = txt.replace("\n", "").replace("\t", "");
+//                                                     txt = txt.replace("\t", "  ");
+//                                                     sb.append(txt);
+//                                             } else {
+//                                                     try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+//                                                             child.getSession().exportDocumentView(child.getPath(), out, true, false);
+//                                                             sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8));
+//                                                     } catch (IOException e) {
+//                                                             throw new IllegalStateException("Cannot export " + child, e);
+//                                                     }
+//                                             }
+//                                     }
+                                       return sb.toString();
+                               } else {
+                                       throw new IllegalArgumentException("Don't know how to interpret " + node);
+                               }
+                       } else {// property
+                               Property property = (Property) item;
+                               return property.getString();
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot get " + item + " content", e);
+               }
+       }
+
+       private void readXml(Node node, StringBuilder sb) throws RepositoryException {
+               NodeIterator nit = node.getNodes();
+               while (nit.hasNext()) {
+                       Node child = nit.nextNode();
+                       if (child.getName().equals(Jcr.JCR_XMLTEXT)) {
+                               String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString();
+                               // TODO make it more robust
+                               // txt = txt.replace("\n", "").replace("\t", "");
+                               txt = txt.replace("\t", "  ");
+                               sb.append(txt);
+                       } else {
+                               sb.append('<').append(child.getName());
+                               PropertyIterator pit = child.getProperties();
+                               properties: while (pit.hasNext()) {
+                                       Property p = pit.nextProperty();
+                                       if (p.getName().startsWith("jcr:"))
+                                               continue properties;
+                                       sb.append(' ').append(p.getName()).append("=\"").append(p.getString()).append('\"');
+                               }
+                               sb.append('>');
+                               readXml(child, sb);
+//                             try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
+//                                     child.getSession().exportDocumentView(child.getPath(), out, true, false);
+//                                     sb.append(new String(out.toByteArray(), StandardCharsets.UTF_8));
+//                             } catch (IOException e) {
+//                                     throw new IllegalStateException("Cannot export " + child, e);
+//                             }
+                               sb.append("</").append(child.getName()).append('>');
+                       }
+               }
+       }
+
+       private void readAsSimpleHtml(Node node, StringBuilder sb) throws RepositoryException {
+               NodeIterator nit = node.getNodes();
+               while (nit.hasNext()) {
+                       Node child = nit.nextNode();
+                       if (child.getName().equals(Jcr.JCR_XMLTEXT)) {
+                               String txt = child.getProperty(Jcr.JCR_XMLCHARACTERS).getString();
+                               // TODO make it more robust
+                               // txt = txt.replace("\n", "").replace("\t", "");
+                               txt = txt.replace("\t", "  ");
+                               String html = textToSimpleHtml(txt);
+                               sb.append(html);
+                       } else if (child.getName().equals(DbkType.link.get())) {
+                               if (child.hasProperty(DbkAttr.XLINK_HREF)) {
+                                       String href = child.getProperty(DbkAttr.XLINK_HREF).getString();
+                                       // TODO deal with other forbidden XML characters?
+                                       href = href.replace("&", "&amp;");
+                                       sb.append("<a class='" + linkCssClass + "' href='").append(href).append("'>");
+                                       readAsSimpleHtml(child, sb);
+                                       sb.append("</a>");
+                               }
+                       } else {
+                               // ignore
+                       }
+               }
+       }
+
+       private String textToSimpleHtml(String raw) {
+               // FIXME the saved data should be corrected instead.
+               if (raw.indexOf('&') >= 0) {
+                       raw = raw.replace("&", "&amp;");
+               }
+               if (raw.indexOf('<') >= 0) {
+                       raw = raw.replace("<", "&lt;");
+               }
+               if (raw.indexOf('>') >= 0) {
+                       raw = raw.replace(">", "&gt;");
+               }
+               if (raw.indexOf('\"') >= 0) {
+                       raw = raw.replace("\"", "&quot;");
+               }
+               if (raw.indexOf('\'') >= 0) {
+                       raw = raw.replace("\'", "&apos;");
+               }
+//             raw = "<span style='text-align:justify'>" + raw + "</span>";
+               if (raw.length() == 0)
+                       return raw;
+               try (StringReader reader = new StringReader(raw)) {
+                       List<String> lines = IOUtils.readLines(reader);
+                       if (lines.size() == 1)
+                               return lines.get(0);
+                       StringBuilder sb = new StringBuilder(raw.length() + lines.size() * BR_LENGTH);
+                       for (int i = 0; i < lines.size(); i++) {
+                               if (i != 0)
+                                       sb.append("<br/>");
+                               sb.append(lines.get(i));
+                       }
+                       return sb.toString();
+               }
+       }
+
+       final static int BR_LENGTH = "<br/>".length();
+
+       public String readSimpleHtml(Item item) {
+               try {
+                       StringBuilder sb = new StringBuilder();
+//                     sb.append("<div style='text-align: justify;'>");
+                       readAsSimpleHtml((Node) item, sb);
+//                     sb.append("</div>");
+//                     System.out.println(sb);
+                       return sb.toString();
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot convert " + item + " to simple HTML", e);
+               }
+       }
+
+       // EXTENSIBILITY
+       /**
+        * To be overridden, in order to make sure that only valid strings are being
+        * stored.
+        */
+       protected void validateBeforeStoring(String raw) {
+       }
+
+       /** To be overridden, in order to support additional formatting. */
+       protected String convertToStorage(Item item, String content) throws RepositoryException {
+               return content;
+
+       }
+
+       /** To be overridden, in order to support additional formatting. */
+       protected String convertFromStorage(Item item, String content) throws RepositoryException {
+               return content;
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkVideo.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DbkVideo.java
new file mode 100644 (file)
index 0000000..a0944d5
--- /dev/null
@@ -0,0 +1,227 @@
+package org.argeo.app.ui.docbook;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Item;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.api.acr.ldap.NamingUtils;
+import org.argeo.app.docbook.DbkAttr;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.app.jcr.docbook.DbkJcrUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.ui.viewers.NodePart;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.cms.ui.viewers.SectionPart;
+import org.argeo.cms.ui.widgets.StyledControl;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+
+public class DbkVideo extends StyledControl implements SectionPart, NodePart {
+       private static final long serialVersionUID = -8753232181570351880L;
+       private Section section;
+
+       private int width = 640;
+       private int height = 360;
+
+       private boolean editable;
+
+       public DbkVideo(Composite parent, int style, Node node) {
+               this(Section.findSection(parent), parent, style, node);
+       }
+
+       DbkVideo(Section section, Composite parent, int style, Node node) {
+               super(parent, style, node);
+               editable = !(SWT.READ_ONLY == (style & SWT.READ_ONLY));
+               this.section = section;
+               setStyle(DbkType.videoobject.name());
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               Node mediaobject = getNode();
+               Composite wrapper = new Composite(box, SWT.NONE);
+               wrapper.setLayout(CmsSwtUtils.noSpaceGridLayout());
+
+               Composite browserC = new Composite(wrapper, SWT.NONE);
+               browserC.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               GridData gd = new GridData(SWT.CENTER, SWT.FILL, true, true);
+               gd.widthHint = getWidth();
+               gd.heightHint = getHeight();
+               browserC.setLayoutData(gd);
+//             wrapper.setLayoutData(CmsUiUtils.fillAll());
+               Browser browser = new Browser(browserC, SWT.NONE);
+
+               if (editable) {
+                       Composite editor = new Composite(wrapper, SWT.BORDER);
+                       editor.setLayout(new GridLayout(3, false));
+                       editor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+                       String fileref = DbkJcrUtils.getMediaFileref(mediaobject);
+                       Text text = new Text(editor, SWT.SINGLE);
+                       if (fileref != null)
+                               text.setText(fileref);
+                       else
+                               text.setMessage("Embed URL of the video");
+                       text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+                       Button updateB = new Button(editor, SWT.FLAT);
+                       updateB.setText("Update");
+                       updateB.addSelectionListener(new Selected() {
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       try {
+                                               Node videodata = mediaobject.getNode(DbkType.videoobject.get())
+                                                               .getNode(DbkType.videodata.get());
+                                               String txt = text.getText();
+                                               URI uri;
+                                               try {
+                                                       uri = new URI(txt);
+                                               } catch (URISyntaxException e1) {
+                                                       text.setText("");
+                                                       text.setMessage("Invalid URL");
+                                                       return;
+                                               }
+
+                                               // Transform watch URL in embed
+                                               // YouTube
+                                               String videoId = null;
+                                               if ("www.youtube.com".equals(uri.getHost()) || "youtube.com".equals(uri.getHost())
+                                                               || "youtu.be".equals(uri.getHost())) {
+                                                       if ("www.youtube.com".equals(uri.getHost()) || "youtube.com".equals(uri.getHost())) {
+                                                               if ("/watch".equals(uri.getPath())) {
+                                                                       Map<String, List<String>> map = NamingUtils.queryToMap(uri);
+                                                                       videoId = map.get("v").get(0);
+                                                               }
+                                                       } else if ("youtu.be".equals(uri.getHost())) {
+                                                               videoId = uri.getPath().substring(1);
+                                                       }
+                                                       if (videoId != null) {
+                                                               try {
+                                                                       uri = new URI("https://www.youtube.com/embed/" + videoId);
+                                                                       text.setText(uri.toString());
+                                                               } catch (URISyntaxException e1) {
+                                                                       throw new IllegalStateException(e1);
+                                                               }
+                                                       }
+                                               }
+
+                                               // Vimeo
+                                               if ("vimeo.com".equals(uri.getHost())) {
+                                                       videoId = uri.getPath().substring(1);
+                                                       if (videoId != null) {
+                                                               try {
+                                                                       uri = new URI("https://player.vimeo.com/video/" + videoId);
+                                                                       text.setText(uri.toString());
+                                                               } catch (URISyntaxException e1) {
+                                                                       throw new IllegalStateException(e1);
+                                                               }
+                                                       }
+                                               }
+
+                                               videodata.setProperty(DbkAttr.fileref.name(), uri.toString());
+                                               // TODO better integrate it in the edition lifecycle
+                                               videodata.getSession().save();
+                                               load(browser);
+                                       } catch (RepositoryException e1) {
+                                               throw new JcrException("Cannot update " + mediaobject, e1);
+                                       }
+
+                               }
+                       });
+
+                       Button deleteB = new Button(editor, SWT.FLAT);
+                       deleteB.setText("Delete");
+                       deleteB.addSelectionListener(new Selected() {
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       try {
+                                               mediaobject.remove();
+                                               mediaobject.getSession().save();
+                                               dispose();
+                                               getSection().getParent().layout(true, true);
+                                       } catch (RepositoryException e1) {
+                                               throw new JcrException("Cannot update " + mediaobject, e1);
+                                       }
+
+                               }
+                       });
+               }
+
+               // TODO caption
+               return browser;
+       }
+
+       public void load(Control control) {
+               try {
+                       if (control instanceof Browser) {
+                               Browser browser = (Browser) control;
+                               getNode().getSession();
+                               String fileref = DbkJcrUtils.getMediaFileref(getNode());
+                               if (fileref != null) {
+                                       // TODO manage self-hosted videos
+                                       // TODO for YouTube videos, check whether the URL starts with
+                                       // https://www.youtube.com/embed/ and not https://www.youtube.com/watch?v=
+                                       StringBuilder html = new StringBuilder();
+                                       html.append(
+                                                       "<iframe frameborder=\"0\" allow=\"autoplay; fullscreen; picture-in-picture\" allowfullscreen=\"true\"");
+                                       // TODO make size configurable
+                                       html.append("width=\"").append(width).append("\" height=\"").append(height).append("\" ");
+                                       html.append("src=\"").append(fileref).append("\" ");
+                                       html.append("/>");
+                                       browser.setText(html.toString());
+                               }
+                       }
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot retrieve src for video " + getNode(), e);
+               }
+       }
+
+       @Override
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, true, true));
+       }
+
+       @Override
+       protected void setControlLayoutData(Control control) {
+               control.setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       @Override
+       public Item getItem() throws RepositoryException {
+               return getNode();
+       }
+
+       @Override
+       public String getPartId() {
+               return getNodeId();
+       }
+
+       @Override
+       public Section getSection() {
+               return section;
+       }
+
+       public int getWidth() {
+               return width;
+       }
+
+       public int getHeight() {
+               return height;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentPage.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentPage.java
new file mode 100644 (file)
index 0000000..d056493
--- /dev/null
@@ -0,0 +1,62 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.widgets.ScrolledPage;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsLink;
+import org.argeo.cms.ui.viewers.JcrVersionCmsEditable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * Display the text of the context, and provide an editor if the user can edit.
+ */
+public class DocumentPage implements CmsUiProvider {
+       public final static String WWW = "www";
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+
+               ScrolledPage page = new ScrolledPage(parent, SWT.NONE);
+               page.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               GridData textGd = CmsSwtUtils.fillAll();
+               page.setLayoutData(textGd);
+
+               if (context.isNodeType(DbkType.article.get())) {
+                       CmsEditable cmsEditable = new JcrVersionCmsEditable(context);
+                       if (cmsEditable.canEdit())
+                               new TextEditorHeader(cmsEditable, parent, SWT.NONE).setLayoutData(CmsSwtUtils.fillWidth());
+                       if (!cmsEditable.isEditing())
+                               cmsEditable.startEditing();
+                       new DocumentTextEditor(page, SWT.FLAT, context, cmsEditable);
+               } else {
+                       parent.setBackgroundMode(SWT.INHERIT_NONE);
+                       if (context.getSession().hasPermission(context.getPath(), Session.ACTION_ADD_NODE)) {
+//                             new DocumentTextEditor(page, SWT.FLAT, indexNode, cmsEditable);
+//                             textGd.heightHint = 400;
+
+                               for (NodeIterator ni = context.getNodes(); ni.hasNext();) {
+                                       Node textNode = ni.nextNode();
+                                       if (textNode.isNodeType(NodeType.NT_FOLDER))
+                                               new CmsLink(textNode.getName() + "/", textNode.getPath()).createUi(parent, textNode);
+                               }
+                               for (NodeIterator ni = context.getNodes(); ni.hasNext();) {
+                                       Node textNode = ni.nextNode();
+                                       if (textNode.isNodeType(DbkType.article.get()) && !textNode.getName().equals(WWW))
+                                               new CmsLink(textNode.getName(), textNode.getPath()).createUi(parent, textNode);
+                               }
+                       }
+               }
+               return page;
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentTextEditor.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/DocumentTextEditor.java
new file mode 100644 (file)
index 0000000..330abd2
--- /dev/null
@@ -0,0 +1,37 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.app.jcr.docbook.DbkJcrUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.swt.widgets.Composite;
+
+/** Text editor where sections and subsections can be managed by the user. */
+public class DocumentTextEditor extends AbstractDbkViewer {
+       private static final long serialVersionUID = 6049661610883342325L;
+
+       public DocumentTextEditor(Composite parent, int style, Node textNode, CmsEditable cmsEditable) {
+               super(new TextSection(parent, style, textNode), style, cmsEditable);
+//             refresh();
+               getMainSection().setLayoutData(CmsSwtUtils.fillWidth());
+       }
+
+       @Override
+       protected void initModel(Node textNode) throws RepositoryException {
+               if (isFlat()) {
+                       DbkJcrUtils.addParagraph(textNode, "");
+               }
+//             else
+//                     textNode.setProperty(DocBookNames.DBK_TITLE, textNode.getName());
+       }
+
+       @Override
+       protected Boolean isModelInitialized(Node textNode) throws RepositoryException {
+               return textNode.hasNode(DbkType.title.get()) || textNode.hasNode(DbkType.para.get())
+                               || (!isFlat() && textNode.hasNode(DbkType.section.get()));
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/Paragraph.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/Paragraph.java
new file mode 100644 (file)
index 0000000..ef23d96
--- /dev/null
@@ -0,0 +1,51 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.viewers.SectionPart;
+import org.argeo.cms.ui.widgets.EditableText;
+import org.argeo.cms.ui.widgets.TextStyles;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/** An editable paragraph. */
+public class Paragraph extends EditableText implements SectionPart {
+       private static final long serialVersionUID = 3746457776229542887L;
+
+       private final TextSection section;
+
+       public Paragraph(TextSection section, int style, Node node) throws RepositoryException {
+               super(section, style, node);
+               this.section = section;
+               CmsSwtUtils.style(this, DbkType.para.name());
+       }
+
+       public TextSection getSection() {
+               return section;
+       }
+
+       @Override
+       protected Label createLabel(Composite box, String style) {
+               Label lbl = super.createLabel(box, style);
+               CmsSwtUtils.disableMarkupValidation(lbl);
+               return lbl;
+       }
+
+       @Override
+       public String getPartId() {
+               return getNodeId();
+       }
+
+       @Override
+       public Node getItem() throws RepositoryException {
+               return getNode();
+       }
+
+       @Override
+       public String toString() {
+               return "Paragraph #" + getPartId();
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextEditorHeader.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextEditorHeader.java
new file mode 100644 (file)
index 0000000..22fd55a
--- /dev/null
@@ -0,0 +1,91 @@
+package org.argeo.app.ui.docbook;
+
+import java.util.Observable;
+import java.util.Observer;
+
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.widgets.TextStyles;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+
+/** Adds editing capabilities to a page editing text */
+public class TextEditorHeader implements SelectionListener, Observer {
+       private static final long serialVersionUID = 4186756396045701253L;
+
+       private final CmsEditable cmsEditable;
+       private Button publish;
+
+       private Composite parent;
+       private Composite display;
+       private Object layoutData;
+
+       public TextEditorHeader(CmsEditable cmsEditable, Composite parent, int style) {
+               this.cmsEditable = cmsEditable;
+               this.parent = parent;
+               if (this.cmsEditable instanceof Observable)
+                       ((Observable) this.cmsEditable).addObserver(this);
+               refresh();
+       }
+
+       protected void refresh() {
+               if (display != null && !display.isDisposed())
+                       display.dispose();
+               display = null;
+               publish = null;
+               if (cmsEditable.isEditing()) {
+                       display = new Composite(parent, SWT.NONE);
+                       // display.setBackgroundMode(SWT.INHERIT_NONE);
+                       display.setLayoutData(layoutData);
+                       display.setLayout(CmsSwtUtils.noSpaceGridLayout());
+                       CmsSwtUtils.style(display, TextStyles.TEXT_EDITOR_HEADER);
+                       publish = new Button(display, SWT.FLAT | SWT.PUSH);
+                       publish.setText(getPublishButtonLabel());
+                       CmsSwtUtils.style(publish, TextStyles.TEXT_EDITOR_HEADER);
+                       publish.addSelectionListener(this);
+                       display.moveAbove(null);
+               }
+               parent.layout();
+       }
+
+       private String getPublishButtonLabel() {
+               if (cmsEditable.isEditing())
+                       return "Publish";
+               else
+                       return "Edit";
+       }
+
+       @Override
+       public void widgetSelected(SelectionEvent e) {
+               if (e.getSource() == publish) {
+                       if (cmsEditable.isEditing()) {
+                               cmsEditable.stopEditing();
+                       } else {
+                               cmsEditable.startEditing();
+                       }
+                       // publish.setText(getPublishButtonLabel());
+               }
+       }
+
+       @Override
+       public void widgetDefaultSelected(SelectionEvent e) {
+       }
+
+       @Override
+       public void update(Observable o, Object arg) {
+               if (o == cmsEditable) {
+                       // publish.setText(getPublishButtonLabel());
+                       refresh();
+               }
+       }
+
+       public void setLayoutData(Object layoutData) {
+               this.layoutData = layoutData;
+               if (display != null && !display.isDisposed())
+                       display.setLayoutData(layoutData);
+       }
+
+}
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextInterpreter.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextInterpreter.java
new file mode 100644 (file)
index 0000000..9da2f6f
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Item;
+
+/** Convert from/to data layer to/from presentation layer. */
+public interface TextInterpreter {
+       String raw(Item item);
+
+       String read(Item item);
+
+       String readSimpleHtml(Item item);
+
+       void write(Item item, String content);
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextSection.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/docbook/TextSection.java
new file mode 100644 (file)
index 0000000..c462d10
--- /dev/null
@@ -0,0 +1,82 @@
+package org.argeo.app.ui.docbook;
+
+import javax.jcr.Node;
+
+import org.argeo.app.docbook.DbkType;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.ui.viewers.Section;
+import org.argeo.cms.ui.widgets.TextStyles;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** An editable section. */
+public class TextSection extends Section {
+       private static final long serialVersionUID = -8625209546243220689L;
+       private String defaultTextStyle = DbkType.para.name();
+       private String titleStyle;
+
+       private final boolean flat;
+
+       private boolean titleReadOnly = false;
+
+       private final int level;
+
+       public TextSection(Composite parent, int style, Node node) {
+               this(parent, findSection(parent), style, node);
+       }
+
+       public TextSection(TextSection section, int style, Node node) {
+               this(section, section.getParentSection(), style, node);
+       }
+
+       private TextSection(Composite parent, Section parentSection, int style, Node node) {
+               super(parent, parentSection, style, node);
+               flat = SWT.FLAT == (style & SWT.FLAT);
+               if (parentSection instanceof TextSection) {
+                       level = ((TextSection) parentSection).getLevel() + 1;
+               } else {
+                       level = 0;
+               }
+               CmsSwtUtils.style(this, DbkType.section.name());
+       }
+
+       public String getDefaultTextStyle() {
+               return defaultTextStyle;
+       }
+
+       public boolean isFlat() {
+               return flat;
+       }
+
+       /** The level of this section, similar to h1, h2, etc. in HTML. */
+       public int getLevel() {
+               return level;
+       }
+
+       public String getTitleStyle() {
+               if (titleStyle != null)
+                       return titleStyle;
+               // TODO make base H styles configurable
+//             Integer relativeDepth = getRelativeDepth();
+//             System.out.println("Level: " + getLevel());
+               return "h" + (getLevel() + 1);
+       }
+
+       public void setDefaultTextStyle(String defaultTextStyle) {
+               this.defaultTextStyle = defaultTextStyle;
+       }
+
+       public void setTitleStyle(String titleStyle) {
+               this.titleStyle = titleStyle;
+       }
+
+       public boolean isTitleReadOnly() {
+               return titleReadOnly;
+       }
+
+       public void setTitleReadOnly(boolean titleReadOnly) {
+               this.titleReadOnly = titleReadOnly;
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/AbstractTermsPart.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/AbstractTermsPart.java
new file mode 100644 (file)
index 0000000..788c253
--- /dev/null
@@ -0,0 +1,131 @@
+package org.argeo.app.ui.forms;
+
+import javax.jcr.Item;
+
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.api.app.Typology;
+import org.argeo.api.cms.ux.CmsIcon;
+import org.argeo.cms.Localized;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.widgets.ContextOverlay;
+import org.argeo.cms.ui.widgets.StyledControl;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** Common logic between single and mutliple terms editable part. */
+public abstract class AbstractTermsPart extends StyledControl implements SwtEditablePart {
+       private static final long serialVersionUID = -5497097995341927710L;
+       protected final TermsManager termsManager;
+       protected final Typology typology;
+
+       private final boolean editable;
+
+       private CmsIcon deleteIcon;
+       private CmsIcon addIcon;
+       private CmsIcon cancelIcon;
+
+       private Color highlightColor;
+       private Composite highlight;
+
+       protected final CmsSwtTheme theme;
+
+       public AbstractTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
+               super(parent, style, item);
+               if (item == null)
+                       throw new IllegalArgumentException("Item cannot be null");
+               this.termsManager = termsManager;
+               this.typology = termsManager.getTypology(typology);
+               this.theme = CmsSwtUtils.getCmsTheme(parent);
+               editable = !(SWT.READ_ONLY == (style & SWT.READ_ONLY));
+               highlightColor = parent.getDisplay().getSystemColor(SWT.COLOR_GRAY);
+       }
+
+       public boolean isEditable() {
+               return editable;
+       }
+
+       protected void createHighlight(Composite block) {
+               highlight = new Composite(block, SWT.NONE);
+               highlight.setBackground(highlightColor);
+               GridData highlightGd = new GridData(SWT.FILL, SWT.FILL, false, false);
+               highlightGd.widthHint = 5;
+               highlightGd.heightHint = 3;
+               highlight.setLayoutData(highlightGd);
+
+       }
+
+       protected String getTermLabel(Term term) {
+               if (term instanceof Localized)
+                       return ((Localized) term).lead();
+               else
+                       return term.getName();
+
+       }
+
+       protected abstract void refresh(ContextOverlay contextArea, String filter, Text txt);
+
+       protected boolean isTermSelectable(Term term) {
+               return true;
+       }
+
+       protected void processTermListLabel(Term term, Label label) {
+
+       }
+
+       protected void setControlLayoutData(Control control) {
+               control.setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       protected void setContainerLayoutData(Composite composite) {
+               composite.setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       //
+       // STYLING
+       //
+       public void setDeleteIcon(CmsIcon deleteIcon) {
+               this.deleteIcon = deleteIcon;
+       }
+
+       public void setAddIcon(CmsIcon addIcon) {
+               this.addIcon = addIcon;
+       }
+
+       public void setCancelIcon(CmsIcon cancelIcon) {
+               this.cancelIcon = cancelIcon;
+       }
+
+       protected TermsManager getTermsManager() {
+               return termsManager;
+       }
+
+       protected void styleDelete(ToolItem deleteItem) {
+               if (deleteIcon != null)
+                       deleteItem.setImage(theme.getSmallIcon(deleteIcon));
+               else
+                       deleteItem.setText("-");
+       }
+
+       protected void styleCancel(ToolItem cancelItem) {
+               if (cancelIcon != null)
+                       cancelItem.setImage(theme.getSmallIcon(cancelIcon));
+               else
+                       cancelItem.setText("X");
+       }
+
+       protected void styleAdd(ToolItem addItem) {
+               if (addIcon != null)
+                       addItem.setImage(theme.getSmallIcon(addIcon));
+               else
+                       addItem.setText("+");
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/MultiTermsPart.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/MultiTermsPart.java
new file mode 100644 (file)
index 0000000..6978596
--- /dev/null
@@ -0,0 +1,207 @@
+package org.argeo.app.ui.forms;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.Item;
+
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.MouseDoubleClick;
+import org.argeo.cms.swt.MouseDown;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.widgets.ContextOverlay;
+import org.argeo.cms.ui.forms.FormStyle;
+import org.argeo.jcr.Jcr;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** {@link SwtEditablePart} for multiple terms. */
+public class MultiTermsPart extends AbstractTermsPart {
+       private static final long serialVersionUID = -4961135649177920808L;
+       private final static CmsLog log = CmsLog.getLog(MultiTermsPart.class);
+
+       public MultiTermsPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
+               super(parent, style, item, termsManager, typology);
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               Composite placeholder = new Composite(box, SWT.NONE);
+
+               boolean vertical = SWT.VERTICAL == (getStyle() & SWT.VERTICAL);
+               RowLayout rl = new RowLayout(vertical ? SWT.VERTICAL : SWT.HORIZONTAL);
+               rl = CmsSwtUtils.noMarginsRowLayout(rl);
+//             rl.wrap = true;
+//             rl.justify = true;
+               placeholder.setLayout(rl);
+               List<Term> currentValue = getValue();
+               if (currentValue != null && !currentValue.isEmpty()) {
+                       for (Term value : currentValue) {
+                               Composite block = new Composite(placeholder, SWT.NONE);
+                               block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+                               Label lbl = new Label(block, SWT.NONE);
+                               String display = getTermLabel(value);
+                               lbl.setText(display);
+                               CmsSwtUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style);
+                               processTermListLabel(value, lbl);
+                               if (isEditable())
+                                       lbl.addMouseListener((MouseDoubleClick) (e) -> {
+                                               startEditing();
+                                       });
+                               if (isEditing()) {
+                                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                                       ToolItem deleteItem = new ToolItem(toolBar, SWT.FLAT);
+                                       styleDelete(deleteItem);
+                                       deleteItem.addSelectionListener((Selected) (e) -> {
+                                               // we retrieve them again here because they may have changed
+                                               List<Term> curr = getValue();
+                                               List<Term> newValue = new ArrayList<>();
+                                               for (Term v : curr) {
+                                                       if (!v.equals(value))
+                                                               newValue.add(v);
+                                               }
+                                               setValue(newValue);
+                                               block.dispose();
+                                               layout(true, true);
+                                       });
+
+                               }
+                       }
+               } else {// empty
+                       if (isEditable() && !isEditing()) {
+                               ToolBar toolBar = new ToolBar(placeholder, SWT.HORIZONTAL);
+                               ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
+                               styleAdd(addItem);
+                               addItem.addSelectionListener((Selected) (e) -> {
+                                       startEditing();
+                               });
+                       }
+               }
+
+               if (isEditing()) {
+                       Composite block = new Composite(placeholder, SWT.NONE);
+                       block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+
+                       createHighlight(block);
+
+                       Text txt = new Text(block, SWT.SINGLE | SWT.BORDER);
+                       txt.setLayoutData(CmsSwtUtils.fillWidth());
+//                     txt.setMessage("[new]");
+
+                       CmsSwtUtils.style(txt, style == null ? FormStyle.propertyText.style() : style);
+
+                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                       ToolItem cancelItem = new ToolItem(toolBar, SWT.FLAT);
+                       styleCancel(cancelItem);
+                       cancelItem.addSelectionListener((Selected) (e) -> {
+                               stopEditing();
+                       });
+
+                       ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
+                               private static final long serialVersionUID = -7980078594405384874L;
+
+                               @Override
+                               protected void onHide() {
+                                       stopEditing();
+                               }
+                       };
+                       contextOverlay.setLayout(new GridLayout());
+                       // filter
+                       txt.addModifyListener((e) -> {
+                               String filter = txt.getText().toLowerCase();
+                               if ("".equals(filter.trim()))
+                                       filter = null;
+                               refresh(contextOverlay, filter, txt);
+                       });
+                       txt.addFocusListener(new FocusListener() {
+                               private static final long serialVersionUID = -6024501573409619949L;
+
+                               @Override
+                               public void focusLost(FocusEvent event) {
+//                                     if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
+//                                             getDisplay().asyncExec(() -> stopEditing());
+                               }
+
+                               @Override
+                               public void focusGained(FocusEvent event) {
+                                       // txt.setText("");
+                                       if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
+                                               refresh(contextOverlay, null, txt);
+                               }
+                       });
+                       layout(new Control[] { txt });
+                       // getDisplay().asyncExec(() -> txt.setFocus());
+               }
+               return placeholder;
+       }
+
+       @Override
+       protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
+               CmsSwtUtils.clear(contextArea);
+               List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
+               List<Term> currentValue = getValue();
+               terms: for (Term term : terms) {
+                       if (currentValue != null && currentValue.contains(term))
+                               continue terms;
+                       String display = getTermLabel(term);
+                       if (filter != null && !display.toLowerCase().contains(filter))
+                               continue terms;
+                       Label termL = new Label(contextArea, SWT.WRAP);
+                       termL.setText(display);
+                       processTermListLabel(term, termL);
+                       if (isTermSelectable(term))
+                               termL.addMouseListener((MouseDown) (e) -> {
+                                       List<Term> newValue = new ArrayList<>();
+                                       List<Term> curr = getValue();
+                                       if (currentValue != null)
+                                               newValue.addAll(curr);
+                                       newValue.add(term);
+                                       setValue(newValue);
+                                       contextArea.hide();
+                                       stopEditing();
+                               });
+               }
+               contextArea.show();
+       }
+
+       protected List<Term> getValue() {
+               String property = typology.getId();
+               List<String> curr = Jcr.getMultiple(getNode(), property);
+               List<Term> res = new ArrayList<>();
+               if (curr != null)
+                       terms: for (String str : curr) {
+                               Term term = termsManager.getTerm(str);
+                               if (term == null) {
+                                       if (log.isTraceEnabled())
+                                               log.warn("Ignoring term " + str + " for " + getNode() + ", as it was not found.");
+                                       continue terms;
+                               }
+                               res.add(term);
+                       }
+               return res;
+       }
+
+       protected void setValue(List<Term> value) {
+               String property = typology.getId();
+               List<String> ids = new ArrayList<>();
+               for (Term term : value) {
+                       ids.add(term.getId());
+               }
+               Jcr.set(getNode(), property, ids);
+               Jcr.save(getNode());
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/SingleTermPart.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/forms/SingleTermPart.java
new file mode 100644 (file)
index 0000000..401fe3a
--- /dev/null
@@ -0,0 +1,159 @@
+package org.argeo.app.ui.forms;
+
+import java.util.List;
+
+import javax.jcr.Item;
+
+import org.argeo.api.app.Term;
+import org.argeo.api.app.TermsManager;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.SwtEditablePart;
+import org.argeo.cms.swt.MouseDoubleClick;
+import org.argeo.cms.swt.MouseDown;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.widgets.ContextOverlay;
+import org.argeo.cms.ui.forms.FormStyle;
+import org.argeo.jcr.Jcr;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** {@link SwtEditablePart} for terms. */
+public class SingleTermPart extends AbstractTermsPart {
+       private static final long serialVersionUID = -4961135649177920808L;
+
+       public SingleTermPart(Composite parent, int style, Item item, TermsManager termsManager, String typology) {
+               super(parent, style, item, termsManager, typology);
+       }
+
+       @Override
+       protected Control createControl(Composite box, String style) {
+               if (isEditing()) {
+                       Composite block = new Composite(box, SWT.NONE);
+                       block.setLayout(CmsSwtUtils.noSpaceGridLayout(3));
+
+                       createHighlight(block);
+
+                       Text txt = new Text(block, SWT.SINGLE | SWT.BORDER);
+                       CmsSwtUtils.style(txt, style == null ? FormStyle.propertyText.style() : style);
+
+                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                       ToolItem deleteItem = new ToolItem(toolBar, SWT.PUSH);
+                       styleDelete(deleteItem);
+                       deleteItem.addSelectionListener((Selected) (e) -> {
+                               setValue(null);
+                               stopEditing();
+                       });
+                       ToolItem cancelItem = new ToolItem(toolBar, SWT.PUSH);
+                       styleCancel(cancelItem);
+                       cancelItem.addSelectionListener((Selected) (e) -> {
+                               stopEditing();
+                       });
+
+                       ContextOverlay contextOverlay = new ContextOverlay(txt, SWT.NONE) {
+                               private static final long serialVersionUID = -7980078594405384874L;
+
+                               @Override
+                               protected void onHide() {
+                                       stopEditing();
+                               }
+                       };
+                       contextOverlay.setLayout(new GridLayout());
+                       // filter
+                       txt.addModifyListener((e) -> {
+                               String filter = txt.getText().toLowerCase();
+                               if ("".equals(filter.trim()))
+                                       filter = null;
+                               refresh(contextOverlay, filter, txt);
+                       });
+                       txt.addFocusListener(new FocusListener() {
+                               private static final long serialVersionUID = -6024501573409619949L;
+
+                               @Override
+                               public void focusLost(FocusEvent event) {
+//                                     if (!contextOverlay.isDisposed() && contextOverlay.isShellVisible())
+//                                             getDisplay().asyncExec(() -> stopEditing());
+                               }
+
+                               @Override
+                               public void focusGained(FocusEvent event) {
+                                       // txt.setText("");
+                                       if (!contextOverlay.isDisposed() && !contextOverlay.isShellVisible())
+                                               refresh(contextOverlay, null, txt);
+                               }
+                       });
+                       layout(new Control[] { block });
+                       getDisplay().asyncExec(() -> txt.setFocus());
+                       return block;
+               } else {
+                       Composite block = new Composite(box, SWT.NONE);
+                       block.setLayout(CmsSwtUtils.noSpaceGridLayout(2));
+                       Term currentValue = getValue();
+                       if (currentValue != null) {
+                               Label lbl = new Label(block, SWT.SINGLE);
+                               String display = getTermLabel(currentValue);
+                               lbl.setText(display);
+                               CmsSwtUtils.style(lbl, style == null ? FormStyle.propertyText.style() : style);
+                               processTermListLabel(currentValue, lbl);
+                               if (isEditable()) {
+                                       lbl.addMouseListener((MouseDoubleClick) (e) -> {
+                                               startEditing();
+                                       });
+                               }
+                       } else {
+                               if (isEditable()) {
+                                       ToolBar toolBar = new ToolBar(block, SWT.HORIZONTAL);
+                                       ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
+                                       styleAdd(addItem);
+                                       addItem.addSelectionListener((Selected) (e) -> {
+                                               startEditing();
+                                       });
+                               }
+                       }
+                       return block;
+               }
+       }
+
+       @Override
+       protected void refresh(ContextOverlay contextArea, String filter, Text txt) {
+               CmsSwtUtils.clear(contextArea);
+               List<? extends Term> terms = termsManager.listAllTerms(typology.getId());
+               terms: for (Term term : terms) {
+                       String display = getTermLabel(term);
+                       if (filter != null && !display.toLowerCase().contains(filter))
+                               continue terms;
+                       Label termL = new Label(contextArea, SWT.WRAP);
+                       termL.setText(display);
+                       processTermListLabel(term, termL);
+                       if (isTermSelectable(term))
+                               termL.addMouseListener((MouseDown) (e) -> {
+                                       setValue(term);
+                                       contextArea.hide();
+                                       stopEditing();
+                               });
+               }
+               contextArea.show();
+               // txt.setFocus();
+       }
+
+       protected Term getValue() {
+               String property = typology.getId();
+               String id = Jcr.get(getNode(), property);
+               Term term = termsManager.getTerm(id);
+
+               return term;
+       }
+
+       protected void setValue(Term value) {
+               String property = typology.getId();
+               Jcr.set(getNode(), property, value != null ? value.getId() : null);
+               Jcr.save(getNode());
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/ContentEntryArea.java
new file mode 100644 (file)
index 0000000..aa939d6
--- /dev/null
@@ -0,0 +1,57 @@
+package org.argeo.app.ui.library;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.widgets.SwtTreeView;
+import org.argeo.cms.ux.acr.ContentHierarchicalPart;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+public class ContentEntryArea implements SwtUiProvider {
+       private final static CmsLog log = CmsLog.getLog(ContentEntryArea.class);
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+
+               parent.setLayout(new GridLayout());
+
+               new Label(parent, 0).setText(context.toString());
+
+               Content rootContent = ((ProvidedContent) context).getSession().getRepository().get().get("/sys");
+
+               ContentHierarchicalPart contentPart = new ContentHierarchicalPart() {
+
+                       @Override
+                       protected boolean isLeaf(Content content) {
+                               if (content.hasContentClass(EntityType.document.qName()))
+                                       return true;
+                               return super.isLeaf(content);
+                       }
+
+               };
+               contentPart.addColumn((c) -> NamespaceUtils.toPrefixedName(c.getName()));
+               contentPart.setInput(rootContent);
+
+               SwtTreeView<Content> view = new SwtTreeView<>(parent, 0, contentPart);
+               view.setLayoutData(CmsSwtUtils.fillAll());
+
+               contentPart.setInput(rootContent);
+               contentPart.onSelected((o) -> {
+                       Content c = (Content) o;
+                       log.debug(c.getPath());
+                       cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(c));
+               });
+               return view;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsContextMenu.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsContextMenu.java
new file mode 100644 (file)
index 0000000..82a21c1
--- /dev/null
@@ -0,0 +1,177 @@
+package org.argeo.app.ui.library;
+
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_BOOKMARK_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_CREATE_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_DELETE;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_DOWNLOAD_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_RENAME;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_SHARE_FOLDER;
+import static org.argeo.app.ui.library.DocumentsUiService.ACTION_ID_UPLOAD_FILE;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.argeo.app.ui.widgets.AbstractConnectContextMenu;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Control;
+
+/** Generic popup context menu to manage NIO Path in a Viewer. */
+public class DocumentsContextMenu extends AbstractConnectContextMenu {
+       // Local context
+       private final DocumentsFolderComposite browser;
+       private final DocumentsUiService uiService;
+//     private final Repository repository;
+
+       private final static String[] DEFAULT_ACTIONS = { ACTION_ID_CREATE_FOLDER, ACTION_ID_BOOKMARK_FOLDER,
+                       ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME,
+                       ACTION_ID_DELETE };
+
+       private Path currFolderPath;
+
+       public DocumentsContextMenu(DocumentsFolderComposite browser,
+                       DocumentsUiService documentsUiService) {
+               super(browser.getDisplay(), DEFAULT_ACTIONS);
+               this.browser = browser;
+               this.uiService = documentsUiService;
+//             this.repository = repository;
+
+               createControl();
+       }
+
+       public void setCurrFolderPath(Path currFolderPath) {
+               this.currFolderPath = currFolderPath;
+       }
+
+       protected boolean aboutToShow(Control source, Point location, IStructuredSelection selection) {
+               boolean emptySel = true;
+               boolean multiSel = false;
+               boolean isFolder = true;
+               if (selection != null && !selection.isEmpty()) {
+                       emptySel = false;
+                       multiSel = selection.size() > 1;
+                       if (!multiSel && selection.getFirstElement() instanceof Path) {
+                               isFolder = Files.isDirectory((Path) selection.getFirstElement());
+                       }
+               }
+               if (emptySel) {
+                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_BOOKMARK_FOLDER);
+                       setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_RENAME, ACTION_ID_DELETE
+                               );
+               } else if (multiSel) {
+                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_DELETE,
+                                       ACTION_ID_BOOKMARK_FOLDER);
+                       setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_RENAME);
+               } else if (isFolder) {
+                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME, ACTION_ID_DELETE,
+                                       ACTION_ID_BOOKMARK_FOLDER);
+                       setVisible(false, 
+                                       // to be implemented
+                                       ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER);
+               } else {
+                       setVisible(true, ACTION_ID_CREATE_FOLDER, ACTION_ID_UPLOAD_FILE, ACTION_ID_RENAME,
+                                       ACTION_ID_DELETE);
+                       setVisible(false, ACTION_ID_SHARE_FOLDER, ACTION_ID_DOWNLOAD_FOLDER, ACTION_ID_BOOKMARK_FOLDER);
+               }
+               return true;
+       }
+
+       public void show(Control source, Point location, IStructuredSelection selection, Path currFolderPath) {
+               // TODO find a better way to retrieve the parent path (cannot be deduced
+               // from table content because it will fail on an empty folder)
+               this.currFolderPath = currFolderPath;
+               super.show(source, location, selection);
+
+       }
+
+       @Override
+       protected boolean performAction(String actionId) {
+               switch (actionId) {
+               case ACTION_ID_CREATE_FOLDER:
+                       createFolder();
+                       break;
+               case ACTION_ID_BOOKMARK_FOLDER:
+                       bookmarkFolder();
+                       break;
+               case ACTION_ID_RENAME:
+                       renameItem();
+                       break;
+               case ACTION_ID_DELETE:
+                       deleteItems();
+                       break;
+//             case ACTION_ID_OPEN:
+//                     openFile();
+//                     break;
+               case ACTION_ID_UPLOAD_FILE:
+                       uploadFiles();
+                       break;
+               default:
+                       throw new IllegalArgumentException("Unimplemented action " + actionId);
+                       // case ACTION_ID_SHARE_FOLDER:
+                       // return "Share Folder";
+                       // case ACTION_ID_DOWNLOAD_FOLDER:
+                       // return "Download as zip archive";
+               }
+               browser.setFocus();
+               return false;
+       }
+
+       @Override
+       protected String getLabel(String actionId) {
+               return uiService.getLabel(actionId);
+       }
+
+       private void openFile() {
+               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+               if (selection.isEmpty() || selection.size() > 1)
+                       // Should never happen
+                       return;
+               Path toOpenPath = ((Path) selection.getFirstElement());
+               uiService.openFile(toOpenPath);
+       }
+
+       private void deleteItems() {
+               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+               if (selection.isEmpty())
+                       return;
+               else if (uiService.deleteItems(getParentShell(), selection))
+                       browser.refresh();
+       }
+
+       private void renameItem() {
+               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+               if (selection.isEmpty() || selection.size() > 1)
+                       // Should never happen
+                       return;
+               Path toRenamePath = ((Path) selection.getFirstElement());
+               if (uiService.renameItem(getParentShell(), currFolderPath, toRenamePath))
+                       browser.refresh();
+       }
+
+       private void createFolder() {
+               if (uiService.createFolder(getParentShell(), currFolderPath))
+                       browser.refresh();
+       }
+
+       private void bookmarkFolder() {
+               Path toBookmarkPath = null;
+               IStructuredSelection selection = ((IStructuredSelection) browser.getViewer().getSelection());
+               if (selection.isEmpty())
+                       toBookmarkPath = currFolderPath;
+               else if (selection.size() > 1)
+                       toBookmarkPath = currFolderPath;
+               else if (selection.size() == 1) {
+                       Path currSelected = ((Path) selection.getFirstElement());
+                       if (Files.isDirectory(currSelected))
+                               toBookmarkPath = currSelected;
+                       else
+                               return;
+               }
+               //uiService.bookmarkFolder(toBookmarkPath, repository, null);
+       }
+
+       private void uploadFiles() {
+               if (uiService.uploadFiles(getParentShell(), currFolderPath))
+                       browser.refresh();
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFileComposite.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFileComposite.java
new file mode 100644 (file)
index 0000000..d4b70bb
--- /dev/null
@@ -0,0 +1,118 @@
+package org.argeo.app.ui.library;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.spi.FileSystemProvider;
+
+import javax.jcr.Node;
+
+import org.argeo.api.cms.CmsLog;
+import org.argeo.cms.fs.CmsFsUtils;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.eclipse.ui.fs.FsUiUtils;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+/**
+ * Default Documents file composite: a sashForm with a browser in the middle and
+ * meta data at right hand side.
+ */
+public class DocumentsFileComposite extends Composite {
+       private static final long serialVersionUID = -7567632342889241793L;
+
+       private final static CmsLog log = CmsLog.getLog(DocumentsFileComposite.class);
+
+       private final Node currentBaseContext;
+
+       // UI Parts for the browser
+       private Composite rightPannelCmp;
+
+       public DocumentsFileComposite(Composite parent, int style, Node context, FileSystemProvider fsp) {
+               super(parent, style);
+               this.currentBaseContext = context;
+               this.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               SashForm form = new SashForm(this, SWT.HORIZONTAL);
+
+               Composite centerCmp = new Composite(form, SWT.BORDER | SWT.NO_FOCUS);
+               createDisplay(centerCmp);
+
+               rightPannelCmp = new Composite(form, SWT.NO_FOCUS);
+
+               Path path = CmsFsUtils.getPath(fsp, context);
+               setOverviewInput(path);
+               form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               form.setWeights(new int[] { 55, 20 });
+       }
+
+       private void createDisplay(final Composite parent) {
+               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               Browser browser = new Browser(parent, SWT.NONE);
+               // browser.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true,
+               // true));
+               browser.setLayoutData(EclipseUiUtils.fillAll());
+               // FIXME make it more robust
+               String url = CmsUiUtils.getDataUrl(currentBaseContext, UiContext.getHttpRequest());
+               // FIXME issue with the redirection to https
+               if (url.startsWith("http://") && !url.startsWith("http://localhost"))
+                       url = "https://" + url.substring("http://".length(), url.length());
+               if (log.isTraceEnabled())
+                       log.debug("Trying to display " + url);
+               browser.setUrl(url);
+               browser.layout(true, true);
+       }
+
+       /**
+        * Recreates the content of the box that displays information about the current
+        * selected Path.
+        */
+       private void setOverviewInput(Path path) {
+               try {
+                       EclipseUiUtils.clear(rightPannelCmp);
+                       rightPannelCmp.setLayout(new GridLayout());
+                       if (path != null) {
+                               // if (isImg(context)) {
+                               // EditableImage image = new Img(parent, RIGHT, context,
+                               // imageWidth);
+                               // image.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER,
+                               // true, false,
+                               // 2, 1));
+                               // }
+
+                               Label contextL = new Label(rightPannelCmp, SWT.NONE);
+                               contextL.setText(path.getFileName().toString());
+                               contextL.setFont(EclipseUiUtils.getBoldFont(rightPannelCmp));
+                               addProperty(rightPannelCmp, "Last modified", Files.getLastModifiedTime(path).toString());
+                               // addProperty(rightPannelCmp, "Owner",
+                               // Files.getOwner(path).getName());
+                               if (Files.isDirectory(path)) {
+                                       addProperty(rightPannelCmp, "Type", "Folder");
+                               } else {
+                                       String mimeType = Files.probeContentType(path);
+                                       if (EclipseUiUtils.isEmpty(mimeType))
+                                               mimeType = "<i>Unknown</i>";
+                                       addProperty(rightPannelCmp, "Type", mimeType);
+                                       addProperty(rightPannelCmp, "Size", FsUiUtils.humanReadableByteCount(Files.size(path), false));
+                               }
+                       }
+                       rightPannelCmp.layout(true, true);
+               } catch (IOException e) {
+                       throw new IllegalStateException("Cannot display details for " + path.toString(), e);
+               }
+       }
+
+       // Simplify UI implementation
+       private void addProperty(Composite parent, String propName, String value) {
+               Label propLbl = new Label(parent, SWT.NONE);
+               // propLbl.setText(ConnectUtils.replaceAmpersand(propName + ": " + value));
+               propLbl.setText(value);
+               // CmsUiUtils.markup(propLbl);
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFolderComposite.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFolderComposite.java
new file mode 100644 (file)
index 0000000..58ceed6
--- /dev/null
@@ -0,0 +1,454 @@
+package org.argeo.app.ui.library;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.jcr.Node;
+
+import org.argeo.api.cms.CmsLog;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.fs.FileDrop;
+import org.argeo.cms.ui.fs.FsStyles;
+import org.argeo.eclipse.ui.ColumnDefinition;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.eclipse.ui.fs.FileIconNameLabelProvider;
+import org.argeo.eclipse.ui.fs.FsTableViewer;
+import org.argeo.eclipse.ui.fs.FsUiConstants;
+import org.argeo.eclipse.ui.fs.FsUiUtils;
+import org.argeo.eclipse.ui.fs.NioFileLabelProvider;
+import org.argeo.eclipse.ui.fs.ParentDir;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowData;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Default Documents folder composite: a sashForm layout with a simple table in
+ * the middle and an overview at right hand side.
+ */
+public class DocumentsFolderComposite extends Composite {
+       private final static CmsLog log = CmsLog.getLog(DocumentsFolderComposite.class);
+       private static final long serialVersionUID = -40347919096946585L;
+
+       private final Node currentBaseContext;
+
+       private final DocumentsUiService documentUiService = new DocumentsUiService();
+
+       // UI Parts for the browser
+       private Composite filterCmp;
+       private Composite breadCrumbCmp;
+       private Text filterTxt;
+       private FsTableViewer directoryDisplayViewer;
+       private Composite rightPanelCmp;
+
+       private DocumentsContextMenu contextMenu;
+       private DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm");
+
+       // Local context
+       private Path initialPath;
+       private Path currentFolder;
+
+       public DocumentsFolderComposite(Composite parent, int style, Node context) {
+               super(parent, style);
+               this.currentBaseContext = context;
+
+               this.setLayout(EclipseUiUtils.noSpaceGridLayout());
+
+               SashForm form = new SashForm(this, SWT.HORIZONTAL);
+
+               Composite centerCmp = new Composite(form, SWT.BORDER | SWT.NO_FOCUS);
+               createDisplay(centerCmp);
+
+               rightPanelCmp = new Composite(form, SWT.NO_FOCUS);
+
+               form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+               form.setWeights(new int[] { 55, 20 });
+       }
+
+       public void populate(Path path) {
+               initialPath = path;
+               directoryDisplayViewer.setInitialPath(initialPath);
+               setInput(path);
+       }
+
+       void refresh() {
+               modifyFilter(false);
+       }
+
+       private void createDisplay(final Composite parent) {
+               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+
+               // top filter
+               filterCmp = new Composite(parent, SWT.NO_FOCUS);
+               filterCmp.setLayoutData(EclipseUiUtils.fillWidth());
+               RowLayout rl = new RowLayout(SWT.HORIZONTAL);
+               rl.wrap = true;
+               rl.center = true;
+               filterCmp.setLayout(rl);
+               // addFilterPanel(filterCmp);
+
+               // Main display
+               directoryDisplayViewer = new FsTableViewer(parent, SWT.MULTI);
+               List<ColumnDefinition> colDefs = new ArrayList<>();
+               colDefs.add(new ColumnDefinition(new FileIconNameLabelProvider(), " Name", 250));
+               colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_SIZE), "Size", 100));
+//             colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_TYPE), "Type", 150));
+               colDefs.add(new ColumnDefinition(new NioFileLabelProvider(FsUiConstants.PROPERTY_LAST_MODIFIED),
+                               "Last modified", 400));
+               final Table table = directoryDisplayViewer.configureDefaultTable(colDefs);
+               table.setLayoutData(EclipseUiUtils.fillAll());
+
+               directoryDisplayViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+                       @Override
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
+                               Path selected = null;
+                               if (selection.isEmpty())
+                                       setSelected(null);
+                               else {
+                                       Object o = selection.getFirstElement();
+                                       if (o instanceof Path)
+                                               selected = (Path) o;
+                                       else if (o instanceof ParentDir)
+                                               selected = ((ParentDir) o).getPath();
+                               }
+                               if (selected != null) {
+                                       // TODO manage multiple selection
+                                       setSelected(selected);
+                               }
+                       }
+               });
+
+               directoryDisplayViewer.addDoubleClickListener(new IDoubleClickListener() {
+                       @Override
+                       public void doubleClick(DoubleClickEvent event) {
+                               IStructuredSelection selection = (IStructuredSelection) directoryDisplayViewer.getSelection();
+                               Path selected = null;
+                               if (!selection.isEmpty()) {
+                                       Object o = selection.getFirstElement();
+                                       if (o instanceof Path)
+                                               selected = (Path) o;
+                                       else if (o instanceof ParentDir)
+                                               selected = ((ParentDir) o).getPath();
+                               }
+                               if (selected != null) {
+                                       if (Files.isDirectory(selected))
+                                               setInput(selected);
+                                       else
+                                               externalNavigateTo(selected);
+                               }
+                       }
+               });
+
+               // The context menu
+               contextMenu = new DocumentsContextMenu(this,  documentUiService);
+
+               table.addMouseListener(new MouseAdapter() {
+                       private static final long serialVersionUID = 6737579410648595940L;
+
+                       @Override
+                       public void mouseDown(MouseEvent e) {
+                               if (e.button == 3) {
+                                       // contextMenu.setCurrFolderPath(currDisplayedFolder);
+                                       contextMenu.show(table, new Point(e.x, e.y),
+                                                       (IStructuredSelection) directoryDisplayViewer.getSelection(), currentFolder);
+                               }
+                       }
+               });
+
+               FileDrop fileDrop = new FileDrop() {
+
+                       @Override
+                       protected void processFileUpload(InputStream in, String fileName, String contetnType) throws IOException {
+                               Path file = currentFolder.resolve(fileName);
+                               Files.copy(in, file);
+                               refresh();
+                       }
+               };
+               fileDrop.createDropTarget(directoryDisplayViewer.getTable());
+       }
+
+       /**
+        * Overwrite to enable single sourcing between workbench and CMS navigation
+        */
+       protected void externalNavigateTo(Path path) {
+
+       }
+
+       private void addPathElementBtn(Path path) {
+               Button elemBtn = new Button(breadCrumbCmp, SWT.PUSH);
+               String nameStr;
+               if (path.toString().equals("/"))
+                       nameStr = "[jcr:root]";
+               else
+                       nameStr = path.getFileName().toString();
+//             elemBtn.setText(nameStr + " >> ");
+               elemBtn.setText(nameStr);
+               CmsSwtUtils.style(elemBtn, FsStyles.BREAD_CRUMB_BTN);
+               elemBtn.addSelectionListener(new SelectionAdapter() {
+                       private static final long serialVersionUID = -4103695476023480651L;
+
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               setInput(path);
+                       }
+               });
+       }
+
+       public void setInput(Path path) {
+               if (path.equals(currentFolder))
+                       return;
+               // below initial path
+               if (!initialPath.equals(path) && initialPath.startsWith(path))
+                       return;
+               currentFolder = path;
+
+               Path diff = initialPath.relativize(currentFolder);
+
+               for (Control child : filterCmp.getChildren())
+                       if (!child.equals(filterTxt))
+                               child.dispose();
+
+               // Bread crumbs
+               breadCrumbCmp = new Composite(filterCmp, SWT.NO_FOCUS);
+               CmsSwtUtils.style(breadCrumbCmp, FsStyles.BREAD_CRUMB_BTN);
+               RowLayout breadCrumbLayout = new RowLayout();
+               breadCrumbLayout.spacing = 0;
+               breadCrumbLayout.marginTop = 0;
+               breadCrumbLayout.marginBottom = 0;
+               breadCrumbLayout.marginRight = 0;
+               breadCrumbLayout.marginLeft = 0;
+               breadCrumbCmp.setLayout(breadCrumbLayout);
+               addPathElementBtn(initialPath);
+               Path currTarget = initialPath;
+               if (!diff.toString().equals(""))
+                       for (Path pathElem : diff) {
+                               currTarget = currTarget.resolve(pathElem);
+                               addPathElementBtn(currTarget);
+                       }
+
+               if (filterTxt != null) {
+                       filterTxt.setText("");
+                       filterTxt.moveBelow(null);
+               } else {
+                       modifyFilter(false);
+               }
+               setSelected(null);
+               filterCmp.getParent().layout(true, true);
+       }
+
+       private void setSelected(Path path) {
+               if (path == null)
+                       setOverviewInput(currentFolder);
+               else
+                       setOverviewInput(path);
+       }
+
+       public Viewer getViewer() {
+               return directoryDisplayViewer;
+       }
+
+       /**
+        * Recreates the content of the box that displays information about the current
+        * selected Path.
+        */
+       private void setOverviewInput(Path path) {
+               try {
+                       EclipseUiUtils.clear(rightPanelCmp);
+                       rightPanelCmp.setLayout(new GridLayout());
+                       if (path != null) {
+                               // if (isImg(context)) {
+                               // EditableImage image = new Img(parent, RIGHT, context,
+                               // imageWidth);
+                               // image.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER,
+                               // true, false,
+                               // 2, 1));
+                               // }
+
+                               Label contextL = new Label(rightPanelCmp, SWT.NONE);
+                               contextL.setText(path.getFileName().toString());
+                               contextL.setFont(EclipseUiUtils.getBoldFont(rightPanelCmp));
+                               FileTime lastModified = Files.getLastModifiedTime(path);
+                               if (lastModified.toMillis() != 0)
+                                       try {
+                                               String lastModifiedStr = dateFormat.format(new Date(lastModified.toMillis()));
+                                               addProperty(rightPanelCmp, "Last modified", lastModifiedStr);
+                                       } catch (Exception e) {
+                                               log.error("Workarounded issue while getting last update date for " + path, e);
+                                               addProperty(rightPanelCmp, "Last modified", "-");
+                                       }
+                               // addProperty(rightPannelCmp, "Owner",
+                               // Files.getOwner(path).getName());
+                               if (Files.isDirectory(path)) {
+                                       addProperty(rightPanelCmp, "Type", "Folder");
+                               } else {
+                                       String mimeType = Files.probeContentType(path);
+                                       if (EclipseUiUtils.isEmpty(mimeType))
+                                               mimeType = "<i>Unknown</i>";
+                                       addProperty(rightPanelCmp, "Type", mimeType);
+                                       addProperty(rightPanelCmp, "Size", FsUiUtils.humanReadableByteCount(Files.size(path), false));
+                               }
+
+                               // read all attributes
+//                             Map<String, Object> attrs = Files.readAttributes(path, "*");
+//                             for (String attr : attrs.keySet()) {
+//                                     Object value = attrs.get(attr);
+//                                     String str;
+//                                     if (value instanceof Calendar) {
+//                                             str = dateFormat.format(((Calendar) value).getTime());
+//                                     } else {
+//                                             str = value.toString();
+//                                     }
+//                                     addProperty(rightPanelCmp, attr, str);
+//
+//                             }
+                       }
+                       rightPanelCmp.layout(true, true);
+               } catch (IOException e) {
+                       throw new IllegalStateException("Cannot display details for " + path.toString(), e);
+               }
+       }
+
+       private void addFilterPanel(Composite parent) {
+               // parent.setLayout(EclipseUiUtils.noSpaceGridLayout(new GridLayout(2,
+               // false)));
+
+               filterTxt = new Text(parent, SWT.SEARCH | SWT.ICON_CANCEL);
+               filterTxt.setMessage("Search current folder");
+               filterTxt.setLayoutData(new RowData(250, SWT.DEFAULT));
+               filterTxt.addModifyListener(new ModifyListener() {
+                       private static final long serialVersionUID = 1L;
+
+                       public void modifyText(ModifyEvent event) {
+                               modifyFilter(false);
+                       }
+               });
+               filterTxt.addKeyListener(new KeyListener() {
+                       private static final long serialVersionUID = 2533535233583035527L;
+
+                       @Override
+                       public void keyReleased(KeyEvent e) {
+                       }
+
+                       @Override
+                       public void keyPressed(KeyEvent e) {
+                               // boolean shiftPressed = (e.stateMask & SWT.SHIFT) != 0;
+                               // // boolean altPressed = (e.stateMask & SWT.ALT) != 0;
+                               // FilterEntitiesVirtualTable currTable = null;
+                               // if (currEdited != null) {
+                               // FilterEntitiesVirtualTable table =
+                               // browserCols.get(currEdited);
+                               // if (table != null && !table.isDisposed())
+                               // currTable = table;
+                               // }
+                               //
+                               // if (e.keyCode == SWT.ARROW_DOWN)
+                               // currTable.setFocus();
+                               // else if (e.keyCode == SWT.BS) {
+                               // if (filterTxt.getText().equals("")
+                               // && !(currEdited.getNameCount() == 1 ||
+                               // currEdited.equals(initialPath))) {
+                               // Path oldEdited = currEdited;
+                               // Path parentPath = currEdited.getParent();
+                               // setEdited(parentPath);
+                               // if (browserCols.containsKey(parentPath))
+                               // browserCols.get(parentPath).setSelected(oldEdited);
+                               // filterTxt.setFocus();
+                               // e.doit = false;
+                               // }
+                               // } else if (e.keyCode == SWT.TAB && !shiftPressed) {
+                               // Path uniqueChild = getOnlyChild(currEdited,
+                               // filterTxt.getText());
+                               // if (uniqueChild != null) {
+                               // // Highlight the unique chosen child
+                               // currTable.setSelected(uniqueChild);
+                               // setEdited(uniqueChild);
+                               // }
+                               // filterTxt.setFocus();
+                               // e.doit = false;
+                               // }
+                       }
+               });
+       }
+
+       // private Path getOnlyChild(Path parent, String filter) {
+       // try (DirectoryStream<Path> stream =
+       // Files.newDirectoryStream(currDisplayedFolder, filter + "*")) {
+       // Path uniqueChild = null;
+       // boolean moreThanOne = false;
+       // loop: for (Path entry : stream) {
+       // if (uniqueChild == null) {
+       // uniqueChild = entry;
+       // } else {
+       // moreThanOne = true;
+       // break loop;
+       // }
+       // }
+       // if (!moreThanOne)
+       // return uniqueChild;
+       // return null;
+       // } catch (IOException ioe) {
+       // throw new DocumentsException(
+       // "Unable to determine unique child existence and get it under " + parent +
+       // " with filter " + filter,
+       // ioe);
+       // }
+       // }
+
+       private void modifyFilter(boolean fromOutside) {
+               if (!fromOutside)
+                       if (currentFolder != null) {
+                               String filter;
+                               if (filterTxt != null)
+                                       filter = filterTxt.getText() + "*";
+                               else
+                                       filter = "*";
+                               directoryDisplayViewer.setInput(currentFolder, filter);
+                       }
+       }
+
+       // Simplify UI implementation
+       private void addProperty(Composite parent, String propName, String value) {
+               Label propLbl = new Label(parent, SWT.NONE);
+               //propLbl.setText(ConnectUtils.replaceAmpersand(propName + ": " + value));
+               propLbl.setText(value);
+               //CmsUiUtils.markup(propLbl);
+       }
+
+       public Path getCurrentFolder() {
+               return currentFolder;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFolderUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsFolderUiProvider.java
new file mode 100644 (file)
index 0000000..0ae0ad7
--- /dev/null
@@ -0,0 +1,45 @@
+package org.argeo.app.ui.library;
+
+import java.nio.file.Path;
+import java.nio.file.spi.FileSystemProvider;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.fs.CmsFsUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.jcr.Jcr;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** UI provider of a document folder. */
+public class DocumentsFolderUiProvider implements CmsUiProvider {
+       private FileSystemProvider nodeFileSystemProvider;
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               DocumentsFolderComposite dfc = new DocumentsFolderComposite(parent, SWT.NONE, context) {
+
+                       @Override
+                       protected void externalNavigateTo(Path path) {
+                               Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(Jcr.getSession(context).getRepository(), path));
+                               parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+                               cmsView.sendEvent(SuiteUxEvent.openNewPart.topic(), SuiteUiUtils.eventProperties(folderNode));
+                       }
+               };
+               dfc.setLayoutData(CmsSwtUtils.fillAll());
+               dfc.populate(cmsView.doAs(() -> CmsFsUtils.getPath(nodeFileSystemProvider, context)));
+               return dfc;
+       }
+
+       public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) {
+               this.nodeFileSystemProvider = nodeFileSystemProvider;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsTreeUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsTreeUiProvider.java
new file mode 100644 (file)
index 0000000..1f91b64
--- /dev/null
@@ -0,0 +1,81 @@
+package org.argeo.app.ui.library;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.spi.FileSystemProvider;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+
+import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.cms.fs.CmsFsUtils;
+import org.argeo.cms.jcr.CmsJcrUtils;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.eclipse.ui.fs.FsTreeViewer;
+import org.argeo.jcr.Jcr;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Tree view of a user root folders. */
+public class DocumentsTreeUiProvider implements CmsUiProvider {
+       private FileSystemProvider nodeFileSystemProvider;
+       private Repository repository;
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               parent.setLayout(new GridLayout());
+               FsTreeViewer fsTreeViewer = new FsTreeViewer(parent, SWT.NONE);
+               fsTreeViewer.configureDefaultSingleColumnTable(500);
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               Node homeNode = CmsJcrUtils.getUserHome(cmsView.doAs(() -> Jcr.login(repository, CmsConstants.HOME_WORKSPACE)));
+               parent.addDisposeListener((e1) -> Jcr.logout(homeNode));
+               Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
+               fsTreeViewer.addSelectionChangedListener((e) -> {
+                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+                       if (selection.isEmpty())
+                               return;
+                       else {
+                               Path newSelected = (Path) selection.getFirstElement();
+                               if (Files.isDirectory(newSelected)) {
+                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+                                       cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUiUtils.eventProperties(folderNode));
+                               }
+                       }
+               });
+               fsTreeViewer.addDoubleClickListener((e) -> {
+                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+                       if (selection.isEmpty())
+                               return;
+                       else {
+                               Path newSelected = (Path) selection.getFirstElement();
+                               if (Files.isDirectory(newSelected)) {
+                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+                                       cmsView.sendEvent(SuiteUxEvent.openNewPart.topic(), SuiteUiUtils.eventProperties(folderNode));
+                               }
+                       }
+               });
+               fsTreeViewer.setPathsInput(homePath);
+               fsTreeViewer.getControl().setLayoutData(CmsSwtUtils.fillAll());
+               fsTreeViewer.getControl().getParent().layout(true, true);
+               return fsTreeViewer.getControl();
+       }
+
+       public void setNodeFileSystemProvider(FileSystemProvider nodeFileSystemProvider) {
+               this.nodeFileSystemProvider = nodeFileSystemProvider;
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsUiService.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/DocumentsUiService.java
new file mode 100644 (file)
index 0000000..55a5a94
--- /dev/null
@@ -0,0 +1,308 @@
+package org.argeo.app.ui.library;
+
+import static org.argeo.cms.swt.dialogs.CmsMessageDialog.openConfirm;
+import static org.argeo.cms.swt.dialogs.CmsMessageDialog.openError;
+import static org.argeo.cms.swt.dialogs.SingleValueDialog.ask;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.lang.reflect.Method;
+import java.net.URI;
+import java.nio.file.DirectoryNotEmptyException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.argeo.api.cms.CmsLog;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class DocumentsUiService {
+       private final static CmsLog log = CmsLog.getLog(DocumentsUiService.class);
+
+       // Default known actions
+       public final static String ACTION_ID_CREATE_FOLDER = "createFolder";
+       public final static String ACTION_ID_BOOKMARK_FOLDER = "bookmarkFolder";
+       public final static String ACTION_ID_SHARE_FOLDER = "shareFolder";
+       public final static String ACTION_ID_DOWNLOAD_FOLDER = "downloadFolder";
+       public final static String ACTION_ID_RENAME = "rename";
+       public final static String ACTION_ID_DELETE = "delete";
+       public final static String ACTION_ID_UPLOAD_FILE = "uploadFiles";
+       // public final static String ACTION_ID_OPEN = "open";
+       public final static String ACTION_ID_DELETE_BOOKMARK = "deleteBookmark";
+       public final static String ACTION_ID_RENAME_BOOKMARK = "renameBookmark";
+
+       public String getLabel(String actionId) {
+               switch (actionId) {
+               case ACTION_ID_CREATE_FOLDER:
+                       return "Create Folder";
+               case ACTION_ID_BOOKMARK_FOLDER:
+                       return "Bookmark Folder";
+               case ACTION_ID_SHARE_FOLDER:
+                       return "Share Folder";
+               case ACTION_ID_DOWNLOAD_FOLDER:
+                       return "Download as zip archive";
+               case ACTION_ID_RENAME:
+                       return "Rename";
+               case ACTION_ID_DELETE:
+                       return "Delete";
+               case ACTION_ID_UPLOAD_FILE:
+                       return "Upload Files";
+//             case ACTION_ID_OPEN:
+//                     return "Open";
+               case ACTION_ID_DELETE_BOOKMARK:
+                       return "Delete bookmark";
+               case ACTION_ID_RENAME_BOOKMARK:
+                       return "Rename bookmark";
+               default:
+                       throw new IllegalArgumentException("Unknown action ID " + actionId);
+               }
+       }
+
+       public void openFile(Path toOpenPath) {
+               try {
+                       String name = toOpenPath.getFileName().toString();
+                       File tmpFile = File.createTempFile("tmp", name);
+                       tmpFile.deleteOnExit();
+                       try (OutputStream os = new FileOutputStream(tmpFile)) {
+                               Files.copy(toOpenPath, os);
+                       } catch (IOException e) {
+                               throw new IllegalStateException("Cannot open copy " + name + " to tmpFile.", e);
+                       }
+                       String uri = Paths.get(tmpFile.getAbsolutePath()).toUri().toString();
+                       Map<String, String> params = new HashMap<String, String>();
+//                     params.put(OpenFile.PARAM_FILE_NAME, name);
+//                     params.put(OpenFile.PARAM_FILE_URI, uri);
+                       // FIXME open file without a command
+                       // CommandUtils.callCommand(OpenFile.ID, params);
+               } catch (IOException e1) {
+                       throw new IllegalStateException("Cannot create tmp copy of " + toOpenPath, e1);
+               }
+       }
+
+       public boolean deleteItems(Shell shell, IStructuredSelection selection) {
+               if (selection.isEmpty())
+                       return false;
+
+               StringBuilder builder = new StringBuilder();
+               @SuppressWarnings("unchecked")
+               Iterator<Object> iterator = selection.iterator();
+               List<Path> paths = new ArrayList<>();
+
+               while (iterator.hasNext()) {
+                       Path path = (Path) iterator.next();
+                       builder.append(path.getFileName() + ", ");
+                       paths.add(path);
+               }
+               String msg = "You are about to delete following elements: " + builder.substring(0, builder.length() - 2)
+                               + ". Are you sure?";
+               if (openConfirm(msg)) {
+                       for (Path path : paths) {
+                               try {
+                                       // recursively delete directory and its content
+                                       Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
+                                               @Override
+                                               public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                                                       Files.delete(file);
+                                                       return FileVisitResult.CONTINUE;
+                                               }
+
+                                               @Override
+                                               public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                                                       Files.delete(dir);
+                                                       return FileVisitResult.CONTINUE;
+                                               }
+                                       });
+                               } catch (DirectoryNotEmptyException e) {
+                                       String errMsg = path.getFileName() + " cannot be deleted: directory is not empty.";
+                                       openError( errMsg);
+                                       throw new IllegalArgumentException("Cannot delete path " + path, e);
+                               } catch (IOException e) {
+                                       String errMsg = e.toString();
+                                       openError(errMsg);
+                                       throw new IllegalArgumentException("Cannot delete path " + path, e);
+                               }
+                       }
+                       return true;
+               }
+               return false;
+       }
+
+       public boolean renameItem(Shell shell, Path parentFolderPath, Path toRenamePath) {
+               String msg = "Enter a new name:";
+               String name = ask( msg, toRenamePath.getFileName().toString());
+               // TODO enhance check of name validity
+               if (EclipseUiUtils.notEmpty(name)) {
+                       try {
+                               Path child = parentFolderPath.resolve(name);
+                               if (Files.exists(child)) {
+                                       String errMsg = "An object named " + name + " already exists at " + parentFolderPath.toString()
+                                                       + ", please provide another name";
+                                       openError( errMsg);
+                                       throw new IllegalArgumentException(errMsg);
+                               } else {
+                                       Files.move(toRenamePath, child);
+                                       return true;
+                               }
+                       } catch (IOException e) {
+                               throw new IllegalStateException("Cannot rename " + name + " at " + parentFolderPath.toString(), e);
+                       }
+               }
+               return false;
+       }
+
+       public boolean createFolder(Shell shell, Path currFolderPath) {
+               String msg = "Enter a name:";
+               String name = ask( msg);
+               // TODO enhance check of name validity
+               if (EclipseUiUtils.notEmpty(name)) {
+                       name = name.trim();
+                       try {
+                               Path child = currFolderPath.resolve(name);
+                               if (Files.exists(child)) {
+                                       String errMsg = "A folder named " + name + " already exists at " + currFolderPath.toString()
+                                                       + ", cannot create";
+                                       openError(errMsg);
+                                       throw new IllegalArgumentException(errMsg);
+                               } else {
+                                       Files.createDirectories(child);
+                                       return true;
+                               }
+                       } catch (IOException e) {
+                               throw new IllegalStateException("Cannot create folder " + name + " at " + currFolderPath.toString(), e);
+                       }
+               }
+               return false;
+       }
+
+//     public void bookmarkFolder(Path toBookmarkPath, Repository repository, DocumentsService documentsService) {
+//             String msg = "Provide a name:";
+//             String name = SingleQuestion.ask("Create bookmark", msg, toBookmarkPath.getFileName().toString());
+//             if (EclipseUiUtils.notEmpty(name))
+//                     documentsService.createFolderBookmark(toBookmarkPath, name, repository);
+//     }
+
+       public boolean uploadFiles(Shell shell, Path currFolderPath) {
+//             shell = Display.getCurrent().getActiveShell();// ignore argument
+               try {
+                       FileDialog dialog = new FileDialog(shell, SWT.MULTI);
+                       dialog.setText("Choose one or more files to upload");
+
+                       if (EclipseUiUtils.notEmpty(dialog.open())) {
+                               String[] names = dialog.getFileNames();
+                               // Workaround small differences between RAP and RCP
+                               // 1. returned names are absolute path on RAP and
+                               // relative in RCP
+                               // 2. in RCP we must use getFilterPath that does not
+                               // exists on RAP
+                               Method filterMethod = null;
+                               Path parPath = null;
+                               try {
+                                       filterMethod = dialog.getClass().getDeclaredMethod("getFilterPath");
+                                       String filterPath = (String) filterMethod.invoke(dialog);
+                                       parPath = Paths.get(filterPath);
+                               } catch (NoSuchMethodException nsme) { // RAP
+                               }
+                               if (names.length == 0)
+                                       return false;
+                               else {
+                                       loop: for (String name : names) {
+                                               Path tmpPath = Paths.get(name);
+                                               if (parPath != null)
+                                                       tmpPath = parPath.resolve(tmpPath);
+                                               if (Files.exists(tmpPath)) {
+                                                       URI uri = tmpPath.toUri();
+                                                       String uriStr = uri.toString();
+
+                                                       if (Files.isDirectory(tmpPath)) {
+                                                               openError(
+                                                                               "Upload of directories in the system is not yet implemented");
+                                                               continue loop;
+                                                       }
+                                                       Path targetPath = currFolderPath.resolve(tmpPath.getFileName().toString());
+                                                       try (InputStream in = new FileInputStream(tmpPath.toFile())) {
+                                                               Files.copy(in, targetPath);
+                                                               Files.delete(tmpPath);
+                                                       }
+                                                       if (log.isDebugEnabled())
+                                                               log.debug("copied uploaded file " + uriStr + " to " + targetPath.toString());
+                                               } else {
+                                                       String msg = "Cannot copy tmp file from " + tmpPath.toString();
+                                                       if (parPath != null)
+                                                               msg += "\nPlease remember that file upload fails when choosing files from the \"Recently Used\" bookmarks on some OS";
+                                                       openError( msg);
+                                                       continue loop;
+                                               }
+                                       }
+                                       return true;
+                               }
+                       }
+               } catch (Exception e) {
+                       CmsFeedback.error("Cannot import files to " + currFolderPath,e);
+               }
+               return false;
+       }
+
+//     public boolean deleteBookmark(Shell shell, IStructuredSelection selection, Node bookmarkParent) {
+//             if (selection.isEmpty())
+//                     return false;
+//
+//             StringBuilder builder = new StringBuilder();
+//             @SuppressWarnings("unchecked")
+//             Iterator<Object> iterator = selection.iterator();
+//             List<Node> nodes = new ArrayList<>();
+//
+//             while (iterator.hasNext()) {
+//                     Node node = (Node) iterator.next();
+//                     builder.append(Jcr.get(node, Property.JCR_TITLE) + ", ");
+//                     nodes.add(node);
+//             }
+//             String msg = "You are about to delete following bookmark: " + builder.substring(0, builder.length() - 2)
+//                             + ". Are you sure?";
+//             if (MessageDialog.openConfirm(shell, "Confirm deletion", msg)) {
+//                     Session session = Jcr.session(bookmarkParent);
+//                     try {
+//                             if (session.hasPendingChanges())
+//                                     throw new DocumentsException("Cannot remove bookmarks, session is not clean");
+//                             for (Node path : nodes)
+//                                     path.remove();
+//                             bookmarkParent.getSession().save();
+//                             return true;
+//                     } catch (RepositoryException e) {
+//                             JcrUtils.discardQuietly(session);
+//                             throw new DocumentsException("Cannot delete bookmarks " + builder.toString(), e);
+//                     }
+//             }
+//             return false;
+//     }
+
+//     public boolean renameBookmark(IStructuredSelection selection) {
+//             if (selection.isEmpty() || selection.size() > 1)
+//                     return false;
+//             Node toRename = (Node) selection.getFirstElement();
+//             String msg = "Please provide a new name.";
+//             String name = SingleQuestion.ask("Rename bookmark", msg, ConnectJcrUtils.get(toRename, Property.JCR_TITLE));
+//             if (EclipseUiUtils.notEmpty(name)
+//                             && ConnectJcrUtils.setJcrProperty(toRename, Property.JCR_TITLE, PropertyType.STRING, name)) {
+//                     ConnectJcrUtils.saveIfNecessary(toRename);
+//                     return true;
+//             }
+//             return false;
+//     }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/library/JcrContentEntryArea.java
new file mode 100644 (file)
index 0000000..f2e3e3b
--- /dev/null
@@ -0,0 +1,179 @@
+package org.argeo.app.ui.library;
+
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.query.Query;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.app.ui.SuiteUiUtils;
+import org.argeo.app.ui.widgets.TreeOrSearchArea;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.jcr.acr.JcrContentProvider;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.jcr.Jcr;
+import org.argeo.jcr.JcrException;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public class JcrContentEntryArea implements CmsUiProvider {
+       private JcrContentProvider jcrContentProvider;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
+               parent.setLayout(new GridLayout());
+               Ui ui = new Ui(parent, SWT.NONE);
+               ui.setLayoutData(CmsSwtUtils.fillAll());
+
+               TreeViewerColumn nameCol = new TreeViewerColumn(ui.getTreeViewer(), SWT.NONE);
+               nameCol.getColumn().setWidth(400);
+               nameCol.setLabelProvider(new ColumnLabelProvider() {
+
+                       @Override
+                       public String getText(Object element) {
+                               Node node = (Node) element;
+                               return Jcr.getTitle(node);
+                       }
+
+                       @Override
+                       public Image getImage(Object element) {
+                               Node node = (Node) element;
+                               Image icon;
+                               if (Jcr.isNodeType(node, NodeType.NT_FOLDER)) {
+                                       icon = theme.getSmallIcon(SuiteIcon.folder);
+                               } else if (Jcr.isNodeType(node, NodeType.NT_FILE)) {
+                                       // TODO check recognized document types
+                                       icon = theme.getSmallIcon(SuiteIcon.document);
+                               } else if (Jcr.isNodeType(node, EntityType.document.get())) {
+                                       icon = theme.getSmallIcon(SuiteIcon.document);
+                               } else {
+                                       if (!isLeaf(node))
+                                               icon = theme.getSmallIcon(SuiteIcon.folder);
+                                       else
+                                               icon = null;
+                               }
+                               return icon;
+                       }
+
+               });
+
+               ui.getTreeViewer().addDoubleClickListener(new IDoubleClickListener() {
+
+                       @Override
+                       public void doubleClick(DoubleClickEvent event) {
+                               Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
+                               if (user != null) {
+                                       CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.openNewPart.topic(),
+                                                       SuiteUiUtils.eventProperties(user));
+                               }
+
+                       }
+               });
+               ui.getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() {
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               Node user = (Node) ui.getTreeViewer().getStructuredSelection().getFirstElement();
+                               if (user != null) {
+                                       CmsSwtUtils.getCmsView(parent).sendEvent(SuiteUxEvent.refreshPart.topic(),
+                                                       SuiteUiUtils.eventProperties(user));
+                               }
+                       }
+               });
+
+               ui.getTreeViewer().setContentProvider(new SpacesContentProvider());
+               Session session = jcrContentProvider.getJcrSession(context, CmsConstants.SYS_WORKSPACE);
+               ui.getTreeViewer().setInput(session);
+               return ui;
+       }
+
+       protected boolean isLeaf(Node node) {
+               return Jcr.isNodeType(node, EntityType.entity.get()) || Jcr.isNodeType(node, EntityType.document.get())
+                               || Jcr.isNodeType(node, NodeType.NT_FILE);
+       }
+
+       public void setJcrContentProvider(JcrContentProvider jcrContentProvider) {
+               this.jcrContentProvider = jcrContentProvider;
+       }
+
+       class Ui extends TreeOrSearchArea {
+
+               public Ui(Composite parent, int style) {
+                       super(parent, style);
+               }
+
+       }
+
+       class SpacesContentProvider implements ITreeContentProvider {
+
+               @Override
+               public Object[] getElements(Object inputElement) {
+                       Session session = (Session) inputElement;
+                       try {
+                               Query query = session.getWorkspace().getQueryManager()
+                                               .createQuery("SELECT * FROM [" + EntityType.space.get() + "]", Query.JCR_SQL2);
+                               NodeIterator spacesIt = query.execute().getNodes();
+                               SortedMap<String, Node> map = new TreeMap<>();
+                               while (spacesIt.hasNext()) {
+                                       Node space = spacesIt.nextNode();
+                                       String path = space.getPath();
+                                       map.put(path, space);
+                               }
+                               return map.values().toArray();
+                       } catch (RepositoryException e) {
+                               throw new JcrException(e);
+                       }
+               }
+
+               @Override
+               public Object[] getChildren(Object parentElement) {
+                       Node parent = (Node) parentElement;
+                       if (isLeaf(parent))
+                               return null;
+                       return Jcr.getNodes(parent).toArray();
+               }
+
+               @Override
+               public Object getParent(Object element) {
+                       Node node = (Node) element;
+                       return Jcr.getParent(node);
+               }
+
+               @Override
+               public boolean hasChildren(Object element) {
+                       Node node = (Node) element;
+                       return !isLeaf(node);
+               }
+
+               @Override
+               public void dispose() {
+               }
+
+               @Override
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OpenLayersMap.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OpenLayersMap.java
new file mode 100644 (file)
index 0000000..c0994eb
--- /dev/null
@@ -0,0 +1,307 @@
+package org.argeo.app.ui.openlayers;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.api.app.EntityNames;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.BrowserFunction;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/** Display a map. */
+public class OpenLayersMap extends Composite {
+       private static final long serialVersionUID = 1055893020490283622L;
+
+       private final static CmsLog log = CmsLog.getLog(OpenLayersMap.class);
+
+       private Browser browser;
+       private boolean renderCompleted = false;
+
+       private Double centerLng = null, centerLat = null;
+       private Integer zoom = null;
+       private String vectorSource = null;
+       private String gpxSource = null;
+
+       private String vectorSourceStyle;
+
+       private List<String> geoJsonSources = new ArrayList<>();
+       private Map<String, String> vectorSources = new HashMap<>();
+       private Map<String, String> layerStyles = new HashMap<>();
+
+       private CmsView cmsView;
+
+       public OpenLayersMap(Composite parent, int style, URL mapHtml) {
+               super(parent, style);
+               cmsView = CmsSwtUtils.getCmsView(parent);
+               setLayout(new GridLayout());
+
+               browser = new Browser(this, SWT.BORDER);
+               browser.setLayoutData(CmsSwtUtils.fillAll());
+               String html;
+               try (InputStream in = mapHtml.openStream()) {
+                       html = IOUtils.toString(in, StandardCharsets.UTF_8);
+               } catch (IOException e) {
+                       throw new RuntimeException(e);
+               }
+               new RenderCompleted(browser, "renderCompleted");
+               new OnFeatureSelect(browser, "onFeatureSelect");
+               new OnFeatureUnselect(browser, "onFeatureUnselect");
+               new OnFeatureClick(browser, "onFeatureClick");
+               browser.setText(html);
+       }
+
+       public void setCenter(Double lng, Double lat) {
+               if (isRenderCompleted())
+                       browser.evaluate("map.getView().setCenter(ol.proj.fromLonLat([" + lng + ", " + lat + "]))");
+               this.centerLat = lat;
+               this.centerLng = lng;
+       }
+
+       public synchronized void setRenderCompleted(boolean renderCompleted) {
+               this.renderCompleted = renderCompleted;
+               notifyAll();
+       }
+
+       public synchronized boolean isRenderCompleted() {
+               return renderCompleted;
+       }
+
+       @Override
+       public synchronized void dispose() {
+               long timeout = 500;
+               long begin = System.currentTimeMillis();
+               while (!isRenderCompleted() && ((System.currentTimeMillis() - begin) < timeout)) {
+                       try {
+                               wait(50);
+                       } catch (InterruptedException e) {
+                               // silent
+                       }
+               }
+               super.dispose();
+       }
+
+       public void setZoom(int zoom) {
+               if (isRenderCompleted())
+                       browser.evaluate("map.getView().setZoom(" + zoom + ")");
+               this.zoom = zoom;
+       }
+
+       protected String asVectorSource(List<Node> geoPoints) throws RepositoryException {
+               boolean first = true;
+               StringBuffer sb = new StringBuffer("new ol.source.Vector({ features: [");
+               for (int i = 0; i < geoPoints.size(); i++) {
+                       Node node = geoPoints.get(i);
+                       if (node.isNodeType(EntityType.geopoint.get())) {
+                               if (first)
+                                       first = false;
+                               else
+                                       sb.append(",");
+                               Double lng = node.getProperty(EntityNames.GEO_LONG).getDouble();
+                               Double lat = node.getProperty(EntityNames.GEO_LAT).getDouble();
+                               sb.append("new ol.Feature({ geometry:");
+                               sb.append("new ol.geom.Point(ol.proj.fromLonLat([");
+                               sb.append(lng).append(',').append(lat);
+                               sb.append("]))");
+                               sb.append(",path:\"").append(node.getPath()).append("\"");
+                               sb.append(",name:\"").append(node.getName()).append("\"");
+                               String entityType = null;
+                               if (node.isNodeType(EntityType.local.get())) {
+                                       entityType = node.getProperty(EntityNames.ENTITY_TYPE).getString();
+                                       sb.append(", type:'").append(entityType).append("'");
+                               }
+                               enrichFeature(node, sb);
+                               sb.append("})");
+                       }
+               }
+               sb.append("]");
+               sb.append(" })");
+               return sb.toString();
+       }
+
+       protected void enrichFeature(Node node, StringBuffer sb) throws RepositoryException {
+
+       }
+
+       public void addPoints(List<Node> geoPoints) throws RepositoryException {
+               this.vectorSource = asVectorSource(geoPoints);
+               if (log.isTraceEnabled())
+                       log.trace("Vector source: " + vectorSource);
+               renderVectorSource();
+       }
+
+       public void addPoints(String layerName, List<Node> geoPoints, String style) throws RepositoryException {
+               this.vectorSources.put(layerName, asVectorSource(geoPoints));
+               if (style != null) {
+                       layerStyles.put(layerName, style);
+               }
+               renderVectorSources();
+       }
+
+       protected void renderVectorSource() {
+               if (vectorSource == null)
+                       return;
+               if (isRenderCompleted()) {
+//                     String style = ", style: new ol.style.Style({  image: new ol.style.Icon({ src: '/pkg/org.djapps.on.openheritage.ui/map_oc.png' }) })";
+                       String style = vectorSourceStyle != null ? ", style: " + vectorSourceStyle : "";
+//                     String style = "";
+                       String toEvaluate = "map.addLayer(new ol.layer.Vector({ source: " + vectorSource + style + "}));";
+//                     System.out.println(toEvaluate);
+                       browser.execute(toEvaluate);
+               }
+       }
+
+       protected void renderVectorSources() {
+               if (vectorSources.isEmpty())
+                       return;
+               if (isRenderCompleted()) {
+                       StringBuilder toExecute = new StringBuilder();
+                       for (String name : vectorSources.keySet()) {
+                               String style = layerStyles.containsKey(name) ? ", style: " + layerStyles.get(name) : "";
+                               String toEvaluate = "map.addLayer(new ol.layer.Vector({ source: " + vectorSources.get(name) + style
+                                               + ",name: '" + name + "'}));";
+                               toExecute.append(toEvaluate);
+                       }
+                       if (log.isTraceEnabled())
+                               log.trace(toExecute);
+                       browser.execute(toExecute.toString());
+               }
+       }
+
+       public void addPoint(Double lng, Double lat) {
+               this.vectorSource = "new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
+                               + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] })";
+//             if (renderCompleted) {
+//                     browser.evaluate(
+//                                     "map.addLayer(new ol.layer.Vector({ source: new ol.source.Vector({ features: [ new ol.Feature({ geometry:"
+//                                                     + " new ol.geom.Point(ol.proj.fromLonLat([" + lng + ", " + lat + "])) }) ] }) }));");
+//             }
+               renderVectorSource();
+       }
+
+       public void addGpx(String path) {
+               this.gpxSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GPX() })";
+               renderGpxSource();
+       }
+
+       protected void renderGpxSource() {
+               if (gpxSource == null)
+                       return;
+               if (isRenderCompleted())
+                       browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + gpxSource + "}));");
+       }
+
+       public void addGeoJson(String path) {
+               String geoJsonSource = "new ol.source.Vector({ url: '" + path + "', format: new ol.format.GeoJSON() })";
+               geoJsonSources.add(geoJsonSource);
+               renderGeoJsonSources();
+       }
+
+       protected void renderGeoJsonSources() {
+               if (geoJsonSources.isEmpty())
+                       return;
+               if (isRenderCompleted()) {
+                       for (String geoJson : geoJsonSources) {
+                               browser.evaluate("map.addLayer(new ol.layer.Vector({ source: " + geoJson + "}));");
+                       }
+               }
+       }
+
+       public void setVectorSourceStyle(String vectorSourceStyle) {
+               this.vectorSourceStyle = vectorSourceStyle;
+       }
+
+       private class RenderCompleted extends BrowserFunction {
+
+               RenderCompleted(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       try {
+                               if (!isRenderCompleted()) {
+                                       setRenderCompleted(true);
+                                       if (zoom != null)
+                                               setZoom(zoom);
+                                       if (centerLat != null && centerLng != null) {
+                                               setCenter(centerLng, centerLat);
+                                       }
+                                       if (!geoJsonSources.isEmpty())
+                                               renderGeoJsonSources();
+                                       if (gpxSource != null)
+                                               renderGpxSource();
+                                       if (vectorSource != null)
+                                               renderVectorSource();
+                                       if (!vectorSources.isEmpty())
+                                               renderVectorSources();
+                               }
+                               return null;
+                       } catch (Exception e) {
+                               log.error("Cannot render map", e);
+                               return null;
+                       }
+               }
+       }
+
+       private class OnFeatureSelect extends BrowserFunction {
+
+               OnFeatureSelect(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       if (arguments.length == 0)
+                               return null;
+                       String path = arguments[0].toString();
+                       Map<String, Object> properties = new HashMap<>();
+//                     properties.put(SuiteEvent.NODE_PATH, path);
+//                     properties.put(SuiteEvent.WORKSPACE, CmsConstants.SYS_WORKSPACE);
+                       properties.put(SuiteUxEvent.CONTENT_PATH, '/' + CmsConstants.SYS_WORKSPACE + path);
+                       cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), properties);
+                       return null;
+               }
+       }
+
+       private class OnFeatureUnselect extends BrowserFunction {
+
+               OnFeatureUnselect(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       return null;
+               }
+       }
+
+       private class OnFeatureClick extends BrowserFunction {
+
+               OnFeatureClick(Browser browser, String name) {
+                       super(browser, name);
+               }
+
+               @Override
+               public Object function(Object[] arguments) {
+                       return null;
+               }
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OverviewMap.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/OverviewMap.java
new file mode 100644 (file)
index 0000000..f1d3900
--- /dev/null
@@ -0,0 +1,77 @@
+package org.argeo.app.ui.openlayers;
+
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.observation.Event;
+import javax.jcr.observation.EventIterator;
+import javax.jcr.observation.EventListener;
+import javax.jcr.query.Query;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.app.EntityType;
+import org.argeo.api.cms.CmsConstants;
+import org.argeo.cms.jcr.acr.JcrContentProvider;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.jcr.JcrException;
+import org.argeo.jcr.JcrUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Displays an overview map. */
+public class OverviewMap implements CmsUiProvider {
+       private JcrContentProvider jcrContentProvider;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               parent.setLayout(new GridLayout());
+               Session session = jcrContentProvider.getJcrSession(context, CmsConstants.SYS_WORKSPACE);
+
+               try {
+                       refreshUi(parent, session);
+                       String[] nodeTypes = { EntityType.geopoint.get() };
+                       session.getWorkspace().getObservationManager().addEventListener(new EventListener() {
+
+                               @Override
+                               public void onEvent(EventIterator events) {
+                                       if (!parent.isDisposed())
+                                               parent.getDisplay().asyncExec(() -> {
+                                                       try {
+                                                               refreshUi(parent, session);
+                                                       } catch (RepositoryException e) {
+                                                               throw new JcrException(e);
+                                                       }
+                                               });
+                               }
+                       }, Event.PROPERTY_CHANGED | Event.NODE_ADDED | Event.NODE_REMOVED | Event.PROPERTY_ADDED, "/", true, null,
+                                       nodeTypes, false);
+               } catch (RepositoryException e) {
+                       throw new JcrException("Cannot add JCR observer", e);
+               }
+
+               return parent;
+       }
+
+       protected void refreshUi(Composite parent, Session session) throws RepositoryException {
+               CmsSwtUtils.clear(parent);
+               Query query = session.getWorkspace().getQueryManager()
+                               .createQuery("SELECT * FROM [" + EntityType.geopoint.get() + "]", Query.JCR_SQL2);
+               List<Node> geoPoints = JcrUtils.nodeIteratorToList(query.execute().getNodes());
+               OpenLayersMap map = new OpenLayersMap(parent, SWT.NONE, getClass().getResource("map-osm.html"));
+               map.setLayoutData(CmsSwtUtils.fillAll());
+
+               // apafMap.setZoom(7);
+               // apafMap.setCenter(-2.472, 8.010);
+               map.addPoints(geoPoints);
+       }
+
+       public void setJcrContentProvider(JcrContentProvider jcrContentProvider) {
+               this.jcrContentProvider = jcrContentProvider;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/map-osm.html b/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/map-osm.html
new file mode 100644 (file)
index 0000000..157d708
--- /dev/null
@@ -0,0 +1,41 @@
+<html lang="en">
+<head>
+<link rel="stylesheet"
+       href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css"
+       type="text/css">
+<style>
+</style>
+<script
+       src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
+</head>
+<body>
+       <div id="map" class="map"></div>
+       <script type="text/javascript">
+       // default OSM
+       var source_OSM = new ol.source.OSM();
+       
+       var map = new ol.Map({
+                       target : 'map',
+                       layers : [ new ol.layer.Tile({
+                               source : source_OSM
+                       }) ],
+                       view : new ol.View({
+                               center : ol.proj.fromLonLat([ 34, 34 ]),
+                               zoom : 4
+                       })
+               });
+               map.on('rendercomplete', e => {
+                       console.log('Render completed.');
+                       renderCompleted();
+               });
+               var select = new ol.interaction.Select();
+               map.addInteraction(select);
+           select.on('select',function (e) {
+               if(e.selected.length>0){
+                               console.log('Feature selected: '+e.selected[0].get('path'));
+                       onFeatureSelect(e.selected[0].get('path'));
+               }
+           });
+       </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/map.js b/swt/org.argeo.app.ui/src/org/argeo/app/ui/openlayers/map.js
new file mode 100644 (file)
index 0000000..68489fb
--- /dev/null
@@ -0,0 +1,11 @@
+var map = new ol.Map({
+       target : 'map',
+       layers : [ new ol.layer.Tile({
+               source : new ol.source.OSM()
+       }) ],
+       view : new ol.View({
+               center : ol.proj.fromLonLat([ 34, 34 ]),
+               zoom : 4
+       })
+});
+               
\ No newline at end of file
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/ChooseUserDialog.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/ChooseUserDialog.java
new file mode 100644 (file)
index 0000000..99c7872
--- /dev/null
@@ -0,0 +1,76 @@
+package org.argeo.app.ui.people;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.dialogs.CmsMessageDialog;
+import org.argeo.cms.swt.widgets.SwtTableView;
+import org.argeo.cms.swt.widgets.SwtTreeView;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+
+/** Pick up a user within a hierarchy. */
+public class ChooseUserDialog extends CmsMessageDialog {
+       private ContentSession contentSession;
+       private CmsUserManager cmsUserManager;
+       private HierarchyUnit defaultHierarchyUnit;
+
+       private Content selected;
+
+       public ChooseUserDialog(Shell parentShell, String message, ContentSession contentSession,
+                       CmsUserManager cmsUserManager, HierarchyUnit defaultHierarchyUnit) {
+               super(parentShell, message, CmsMessageDialog.QUESTION);
+               this.contentSession = contentSession;
+               this.cmsUserManager = cmsUserManager;
+               this.defaultHierarchyUnit = defaultHierarchyUnit;
+       }
+
+       @Override
+       protected Control createInputArea(Composite parent) {
+               SashForm sashForm = new SashForm(parent, SWT.HORIZONTAL);
+               CmsSwtUtils.fill(sashForm);
+
+               HierarchyUnitPart hierarchyPart = new HierarchyUnitPart(contentSession, cmsUserManager);
+               SwtTreeView<HierarchyUnit> directoriesView = new SwtTreeView<>(sashForm, SWT.BORDER, hierarchyPart);
+
+               UsersPart usersPart = new UsersPart(contentSession, cmsUserManager);
+
+               SwtTableView<?, ?> usersView = new SwtTableView<>(sashForm, SWT.BORDER, usersPart);
+               usersView.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+               // CONTROLLER
+               hierarchyPart.onSelected((o) -> {
+                       if (o instanceof HierarchyUnit) {
+                               HierarchyUnit hierarchyUnit = (HierarchyUnit) o;
+                               usersPart.setInput(hierarchyUnit);
+                       }
+               });
+
+               usersPart.onSelected((o) -> {
+                       Content user = (Content) o;
+                       selected = user;
+               });
+
+               hierarchyPart.refresh();
+
+               sashForm.setWeights(new int[] { 40, 60 });
+               return sashForm;
+       }
+
+       public Content getSelected() {
+               return selected;
+       }
+
+       @Override
+       protected Point getInitialSize() {
+               return new Point(800, 600);
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/GroupUiProvider.java
new file mode 100644 (file)
index 0000000..6a805c6
--- /dev/null
@@ -0,0 +1,131 @@
+package org.argeo.app.ui.people;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.ldap.LdapAcrUtils;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.acr.spi.ProvidedContent;
+import org.argeo.api.cms.directory.CmsGroup;
+import org.argeo.api.cms.directory.CmsRole;
+import org.argeo.api.cms.directory.CmsUser;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.app.swt.ux.SuiteSwtUtils;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.acr.SwtSection;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.widgets.SwtTableView;
+import org.argeo.cms.ux.widgets.AbstractTabularPart;
+import org.argeo.cms.ux.widgets.CmsDialog;
+import org.argeo.cms.ux.widgets.TabularPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+public class GroupUiProvider implements SwtUiProvider {
+       private CmsUserManager cmsUserManager;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+
+               Content hierarchyUnitContent = context.getParent().getParent();
+               HierarchyUnit hierarchyUnit = hierarchyUnitContent.adapt(HierarchyUnit.class);
+
+               ContentSession contentSession = ((ProvidedContent) context).getSession();
+
+               TabularPart<Content, Content> membersPart = new AbstractTabularPart<Content, Content>() {
+                       List<CmsRole> roles;
+
+                       @Override
+                       public int getItemCount() {
+                               roles = new ArrayList<CmsRole>(context.adapt(CmsGroup.class).getDirectMembers());
+                               return roles.size();
+                       }
+
+                       @Override
+                       public Content getData(int row) {
+                               CmsRole role = roles.get(row);
+                               Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, role);
+                               return content;
+                       }
+
+               };
+               membersPart.addColumn(new UserColumn());
+
+               // VIEW
+               SwtSection area = new SwtSection(parent, 0, context);
+               area.setLayoutData(CmsSwtUtils.fillAll());
+               area.setLayout(new GridLayout());
+
+               // title
+               // TODO localise at content level
+               String title = (context.hasContentClass(LdapObj.organization) ? SuiteMsg.org.lead() : SuiteMsg.group.lead())
+                               + " " + LdapAcrUtils.getLocalized(context, LdapAttr.cn.qName(), CurrentUser.locale()) + " ("
+                               + hierarchyUnit.getHierarchyUnitLabel(CurrentUser.locale()) + ")";
+               SuiteSwtUtils.addFormLabel(area, title);
+
+               // toolbar
+               ToolBar toolBar = new ToolBar(area, SWT.NONE);
+               toolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
+
+               ToolItem deleteItem = new ToolItem(toolBar, SWT.FLAT);
+               deleteItem.setEnabled(false);
+               deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
+
+               ToolItem addItem = new ToolItem(toolBar, SWT.FLAT);
+               addItem.setImage(theme.getSmallIcon(SuiteIcon.add));
+               addItem.setEnabled(CurrentUser.implies(org.argeo.cms.auth.CmsSystemRole.groupAdmin, hierarchyUnit.getBase()));
+
+               // members view
+               SwtTableView<Content, Content> membersView = new SwtTableView<>(area, SWT.BORDER, membersPart);
+               membersView.setLayoutData(CmsSwtUtils.fillAll());
+               membersView.refresh();
+
+               // CONTROLLER
+               membersPart.onSelected((model) -> {
+                       deleteItem.setEnabled(CurrentUser.implies(org.argeo.cms.auth.CmsSystemRole.groupAdmin, hierarchyUnit.getBase()));
+                       deleteItem.setData(model);
+               });
+
+               addItem.addSelectionListener((Selected) (e) -> {
+                       ChooseUserDialog chooseUserDialog = new ChooseUserDialog(parent.getDisplay().getActiveShell(),
+                                       SuiteMsg.chooseAMember.lead(), contentSession, cmsUserManager, hierarchyUnit);
+                       if (chooseUserDialog.open() == CmsDialog.OK) {
+                               Content chosen = chooseUserDialog.getSelected();
+                               cmsUserManager.addMember(context.adapt(CmsGroup.class), chosen.adapt(CmsUser.class));
+                               membersPart.refresh();
+                       }
+               });
+
+               deleteItem.addSelectionListener((Selected) (e) -> {
+                       if (deleteItem.getData() != null) {
+                               Content chosen = (Content) deleteItem.getData();
+                               cmsUserManager.removeMember(context.adapt(CmsGroup.class), chosen.adapt(CmsUser.class));
+                               membersPart.refresh();
+                       }
+               });
+
+               return membersView;
+
+       }
+
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/HierarchyUnitPart.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/HierarchyUnitPart.java
new file mode 100644 (file)
index 0000000..784684d
--- /dev/null
@@ -0,0 +1,74 @@
+package org.argeo.app.ui.people;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.cms.directory.CmsDirectory;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
+import org.argeo.api.cms.ux.CmsIcon;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.auth.CmsSystemRole;
+import org.argeo.cms.ux.widgets.AbstractHierarchicalPart;
+import org.argeo.cms.ux.widgets.Column;
+
+public class HierarchyUnitPart extends AbstractHierarchicalPart<HierarchyUnit> {
+       private ContentSession contentSession;
+       private CmsUserManager cmsUserManager;
+
+       public HierarchyUnitPart(ContentSession contentSession, CmsUserManager cmsUserManager) {
+               this.contentSession = contentSession;
+               this.cmsUserManager = cmsUserManager;
+
+               addColumn(new Column<HierarchyUnit>() {
+
+                       @Override
+                       public String getText(HierarchyUnit model) {
+                               return model.getHierarchyUnitLabel(CurrentUser.locale());
+                       }
+
+                       @Override
+                       public CmsIcon getIcon(HierarchyUnit model) {
+                               Content content = ContentUtils.hierarchyUnitToContent(contentSession, model);
+                               if (content.hasContentClass(LdapObj.organization))
+                                       return SuiteIcon.organisation;
+                               else if (content.hasContentClass(LdapObj.posixGroup))
+                                       return SuiteIcon.users;
+                               else
+                                       return SuiteIcon.addressBook;
+                       }
+               });
+       }
+
+       @Override
+       public List<HierarchyUnit> getChildren(HierarchyUnit parent) {
+               List<HierarchyUnit> visible = new ArrayList<>();
+               if (parent != null) {
+                       if (parent instanceof CmsDirectory) // do no show children of the directories
+                               return visible;
+                       for (HierarchyUnit hu : parent.getDirectHierarchyUnits(true)) {
+                               visible.add(hu);
+                       }
+               } else {
+                       for (UserDirectory directory : cmsUserManager.getUserDirectories()) {
+                               if (CurrentUser.implies(CmsSystemRole.userAdmin, directory.getBase())) {
+                                       visible.add(directory);
+                               }
+                               for (HierarchyUnit hu : directory.getDirectHierarchyUnits(true)) {
+                                       if (CurrentUser.implies(CmsSystemRole.userAdmin, hu.getBase())) {
+                                               visible.add(hu);
+                                       }
+                               }
+
+                       }
+               }
+               return visible;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/HierarchyUnitUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/HierarchyUnitUiProvider.java
new file mode 100644 (file)
index 0000000..374e194
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.app.ui.people;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+
+public class HierarchyUnitUiProvider implements SwtUiProvider {
+       private CmsUserManager cmsUserManager;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               new Label(parent,0).setText("Hierarchy unit "+context);
+               return null;
+       }
+
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewOrgForm.java
new file mode 100644 (file)
index 0000000..2b7dc60
--- /dev/null
@@ -0,0 +1,119 @@
+package org.argeo.app.ui.people;
+
+import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.cms.directory.CmsGroup;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.app.swt.ux.SuiteSwtUtils;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.swt.widgets.SwtGuidedFormPage;
+import org.argeo.cms.ux.widgets.AbstractGuidedForm;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+/** Form to create a new organisation. */
+public class NewOrgForm extends AbstractGuidedForm {
+       private Content hierarchyUnit;
+       private CmsUserManager cmsUserManager;
+
+       protected Text orgNameT;
+
+       public NewOrgForm(CmsUserManager cmsUserManager, Content hierarchyUnit) {
+               this.hierarchyUnit = hierarchyUnit;
+               this.cmsUserManager = cmsUserManager;
+       }
+
+       @Override
+       public void addPages() {
+               try {
+                       MainInfoPage page = new MainInfoPage("main");
+                       addPage(page);
+               } catch (Exception e) {
+                       throw new RuntimeException("Cannot add page to wizard", e);
+               }
+               setFormTitle(SuiteMsg.orgWizardWindowTitle.lead());
+       }
+
+       @Override
+       public boolean performFinish() {
+               String orgName = orgNameT.getText();
+               if (EclipseUiUtils.isEmpty(orgName)) {
+                       CmsFeedback.show(SuiteMsg.allFieldsMustBeSet.lead());
+                       return false;
+               } else {
+                       HierarchyUnit hu = hierarchyUnit.adapt(HierarchyUnit.class);
+                       String dn = "cn=" + orgName + ",ou=Groups," + hu.getBase();
+
+                       CmsGroup user = cmsUserManager.createGroup(dn);
+
+                       Map<String, Object> additionalProperties = new HashMap<>();
+                       additionalProperties.put(LdapAttr.o.name(), orgName);
+
+                       Set<String> objectClasses = new HashSet<>();
+                       objectClasses.add(LdapObj.organization.name());
+                       cmsUserManager.addObjectClasses(user, objectClasses, additionalProperties);
+                       return true;
+               }
+       }
+
+       @Override
+       public boolean performCancel() {
+               return true;
+       }
+
+       @Override
+       public boolean canFinish() {
+               String firstName = orgNameT.getText();
+               if (isEmpty(firstName)) {
+                       return false;
+               } else
+                       return true;
+       }
+
+       protected class MainInfoPage extends SwtGuidedFormPage {
+
+               public MainInfoPage(String pageName) {
+                       super(pageName);
+                       setTitle(SuiteMsg.orgWizardPageTitle.lead());
+               }
+
+               public void createControl(Composite parent) {
+                       parent.setLayout(new GridLayout(2, false));
+
+                       // FirstName
+                       SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.org);
+                       orgNameT = new Text(parent, SWT.BORDER);
+                       // firstNameTxt.setMessage("a first name");
+                       orgNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       ModifyListener ml = new ModifyListener() {
+                               private static final long serialVersionUID = 1939491923843870844L;
+
+                               @Override
+                               public void modifyText(ModifyEvent event) {
+                                       getView().updateButtons();
+                               }
+                       };
+
+                       orgNameT.addModifyListener(ml);
+
+                       orgNameT.setFocus();
+               }
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/NewUserForm.java
new file mode 100644 (file)
index 0000000..bdaa2e8
--- /dev/null
@@ -0,0 +1,161 @@
+package org.argeo.app.ui.people;
+
+import static org.argeo.eclipse.ui.EclipseUiUtils.isEmpty;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.cms.directory.CmsUser;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.app.core.SuiteUtils;
+import org.argeo.app.swt.ux.SuiteSwtUtils;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.swt.widgets.SwtGuidedFormPage;
+import org.argeo.cms.ux.widgets.AbstractGuidedForm;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+/** Ask first & last name. Update the passed node on finish */
+public class NewUserForm extends AbstractGuidedForm {
+       private Content hierarchyUnit;
+       private CmsUserManager cmsUserManager;
+
+       protected Text lastNameT;
+       protected Text firstNameT;
+       protected Text emailT;
+
+       public NewUserForm(CmsUserManager cmsUserManager, Content hierarchyUnit) {
+               this.hierarchyUnit = hierarchyUnit;
+               if (!hierarchyUnit.hasContentClass(LdapObj.posixGroup.qName()))
+                       throw new IllegalArgumentException(hierarchyUnit + " is not a POSIX group");
+               this.cmsUserManager = cmsUserManager;
+       }
+
+       @Override
+       public void addPages() {
+               try {
+                       MainInfoPage page = new MainInfoPage("main");
+                       addPage(page);
+               } catch (Exception e) {
+                       throw new RuntimeException("Cannot add page to wizard", e);
+               }
+               setFormTitle(SuiteMsg.personWizardWindowTitle.lead());
+       }
+
+       /**
+        * Called when the user click on 'Finish' in the wizard. The task is then
+        * created and the corresponding session saved.
+        */
+       @Override
+       public boolean performFinish() {
+               String lastName = lastNameT.getText();
+               String firstName = firstNameT.getText();
+               String email = emailT.getText();
+               if (EclipseUiUtils.isEmpty(lastName) || EclipseUiUtils.isEmpty(firstName) || EclipseUiUtils.isEmpty(email)) {
+                       CmsFeedback.show(SuiteMsg.allFieldsMustBeSet.lead());
+                       return false;
+               } else {
+                       UUID uuid = UUID.randomUUID();
+                       String shortId = uuid.toString().split("-")[0];
+                       String uid = "u" + shortId;
+                       HierarchyUnit hu = hierarchyUnit.adapt(HierarchyUnit.class);
+                       String username = "uid=" + uid + ",ou=People," + hu.getBase();
+
+                       Map<String, Object> properties = new HashMap<>();
+                       properties.put(LdapAttr.givenName.name(), firstName);
+                       properties.put(LdapAttr.sn.name(), lastName);
+                       properties.put(LdapAttr.mail.name(), email);
+                       properties.put(LdapAttr.cn.name(), firstName + " " + lastName);
+                       properties.put(LdapAttr.employeeNumber.name(), uuid.toString());
+
+                       Map<String, Object> credentials = new HashMap<>();
+                       CmsUser user = cmsUserManager.createUser(username, properties, credentials);
+
+                       Long huGidNumber = hierarchyUnit.get(LdapAttr.gidNumber.qName(), Long.class).orElseThrow();
+                       Long nextUserId = SuiteUtils.findNextId(hierarchyUnit, LdapObj.posixAccount.qName());
+                       String homeDirectory = "/home/" + uid;
+                       Map<String, Object> additionalProperties = new HashMap<>();
+                       additionalProperties.put(LdapAttr.uidNumber.name(), nextUserId.toString());
+                       additionalProperties.put(LdapAttr.gidNumber.name(), huGidNumber.toString());
+                       additionalProperties.put(LdapAttr.homeDirectory.name(), homeDirectory);
+
+                       Set<String> objectClasses = new HashSet<>();
+                       objectClasses.add(LdapObj.posixAccount.name());
+                       cmsUserManager.addObjectClasses(user, objectClasses, additionalProperties);
+                       return true;
+               }
+       }
+
+       @Override
+       public boolean performCancel() {
+               return true;
+       }
+
+       @Override
+       public boolean canFinish() {
+               String lastName = lastNameT.getText();
+               String firstName = firstNameT.getText();
+               String email = emailT.getText();
+               if (isEmpty(lastName) || isEmpty(firstName) || isEmpty(email)) {
+                       return false;
+               } else
+                       return true;
+       }
+
+       protected class MainInfoPage extends SwtGuidedFormPage {
+
+               public MainInfoPage(String pageName) {
+                       super(pageName);
+                       setTitle(SuiteMsg.personWizardPageTitle.lead());
+               }
+
+               public void createControl(Composite parent) {
+                       parent.setLayout(new GridLayout(2, false));
+
+                       // FirstName
+                       SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.firstName);
+                       firstNameT = new Text(parent, SWT.BORDER);
+                       // firstNameTxt.setMessage("a first name");
+                       firstNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       // LastName
+                       SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.lastName);
+                       lastNameT = new Text(parent, SWT.BORDER);
+                       // lastNameTxt.setMessage("a last name");
+                       lastNameT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       SuiteSwtUtils.createBoldLabel(parent, SuiteMsg.email);
+                       emailT = new Text(parent, SWT.BORDER);
+                       emailT.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+                       ModifyListener ml = new ModifyListener() {
+                               private static final long serialVersionUID = 1939491923843870844L;
+
+                               @Override
+                               public void modifyText(ModifyEvent event) {
+                                       getView().updateButtons();
+                               }
+                       };
+
+                       firstNameT.addModifyListener(ml);
+                       lastNameT.addModifyListener(ml);
+                       emailT.addModifyListener(ml);
+
+                       firstNameT.setFocus();
+               }
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PeopleEntryArea.java
new file mode 100644 (file)
index 0000000..1700c28
--- /dev/null
@@ -0,0 +1,191 @@
+package org.argeo.app.ui.people;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentRepository;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.app.ux.SuiteUxEvent;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.auth.CmsSystemRole;
+import org.argeo.cms.jcr.acr.JcrContent;
+import org.argeo.cms.swt.CmsSwtTheme;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.swt.widgets.SwtGuidedFormDialog;
+import org.argeo.cms.swt.widgets.SwtTableView;
+import org.argeo.cms.swt.widgets.SwtTreeView;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ux.widgets.CmsDialog;
+import org.argeo.cms.ux.widgets.Column;
+import org.argeo.cms.ux.widgets.GuidedForm;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+
+/** Entry to the admin area. */
+public class PeopleEntryArea implements SwtUiProvider, CmsUiProvider {
+
+       private CmsUserManager cmsUserManager;
+
+       private ContentRepository contentRepository;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               CmsSwtTheme theme = CmsSwtUtils.getCmsTheme(parent);
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               parent.setLayout(new GridLayout());
+
+               ContentSession contentSession = contentRepository.get();
+               SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
+               CmsSwtUtils.fill(sashForm);
+
+               // VIEW
+               HierarchyUnitPart hierarchyPart = new HierarchyUnitPart(contentSession, cmsUserManager);
+               SwtTreeView<HierarchyUnit> directoriesView = new SwtTreeView<>(sashForm, SWT.BORDER, hierarchyPart);
+
+               UsersPart usersPart = new UsersPart(contentSession, cmsUserManager);
+               usersPart.addColumn(new Column<Content>() {
+
+                       @Override
+                       public String getText(Content role) {
+                               return role.attr(LdapAttr.mail);
+                       }
+
+                       @Override
+                       public int getWidth() {
+                               return 300;
+                       }
+               });
+               // toolbar
+               Composite bottom = new Composite(sashForm, SWT.NONE);
+               bottom.setLayoutData(CmsSwtUtils.fillWidth());
+               bottom.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               ToolBar bottomToolBar = new ToolBar(bottom, SWT.NONE);
+               bottomToolBar.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
+
+//             ToolItem deleteItem = new ToolItem(bottomToolBar, SWT.FLAT);
+//             deleteItem.setEnabled(false);
+//             deleteItem.setImage(theme.getSmallIcon(SuiteIcon.delete));
+
+               Menu menu = new Menu(Display.getCurrent().getActiveShell(), SWT.POP_UP);
+               // TODO display add user only if hierarchy unit is a POSIX group
+               // hierarchyUnit.hasContentClass(LdapObjs.posixGroup.qName())
+               MenuItem addUserItem = new MenuItem(menu, SWT.PUSH);
+               addUserItem.setImage(theme.getSmallIcon(SuiteIcon.user));
+               addUserItem.setText(SuiteMsg.user.lead());
+               addUserItem.addSelectionListener((Selected) (e) -> {
+                       HierarchyUnit hierarchyUnit = usersPart.getInput();
+                       Content huContent = ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit);
+                       GuidedForm wizard = new NewUserForm(cmsUserManager, huContent);
+                       SwtGuidedFormDialog dialog = new SwtGuidedFormDialog(parent.getShell(), wizard);
+                       if (dialog.open() == CmsDialog.OK) {
+                               CmsFeedback.show(SuiteMsg.personWizardFeedback.lead());
+                               usersPart.refresh();
+                       }
+               });
+
+               MenuItem addOrgItem = new MenuItem(menu, SWT.PUSH);
+               addOrgItem.setImage(theme.getSmallIcon(SuiteIcon.organisation));
+               addOrgItem.setText(SuiteMsg.org.lead());
+               addOrgItem.addSelectionListener((Selected) (e) -> {
+                       HierarchyUnit hierarchyUnit = usersPart.getInput();
+                       Content huContent = ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit);
+                       GuidedForm wizard = new NewOrgForm(cmsUserManager, huContent);
+                       SwtGuidedFormDialog dialog = new SwtGuidedFormDialog(parent.getShell(), wizard);
+                       if (dialog.open() == CmsDialog.OK) {
+                               CmsFeedback.show(SuiteMsg.orgWizardFeedback.lead());
+                               usersPart.refresh();
+                       }
+               });
+
+               ToolItem addItem = new ToolItem(bottomToolBar, SWT.PUSH);
+               addItem.setEnabled(false);
+               addItem.setImage(theme.getSmallIcon(SuiteIcon.add));
+
+               sashForm.setWeights(new int[] { 30, 70 });
+
+               SwtTableView<?, ?> usersView = new SwtTableView<>(bottom, SWT.BORDER, usersPart);
+               usersView.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+               // CONTROLLER
+               hierarchyPart.onSelected((o) -> {
+                       if (o instanceof HierarchyUnit) {
+                               HierarchyUnit hierarchyUnit = (HierarchyUnit) o;
+                               usersPart.setInput(hierarchyUnit);
+                               addItem.setEnabled(true);
+
+                               addOrgItem.setEnabled(usersPart.getInput() != null
+                                               && CurrentUser.implies(CmsSystemRole.groupAdmin, usersPart.getInput().getBase()));
+//                             cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent
+//                                             .eventProperties(ContentUtils.hierarchyUnitToContent(contentSession, hierarchyUnit)));
+                       }
+               });
+
+               usersPart.onSelected((o) -> {
+                       Content user = (Content) o;
+                       if (user != null) {
+                               cmsView.sendEvent(SuiteUxEvent.refreshPart.topic(), SuiteUxEvent.eventProperties(user));
+//                             deleteItem.setEnabled(true);
+                       } else {
+//                             deleteItem.setEnabled(false);
+                       }
+               });
+
+               usersPart.onAction((o) -> {
+                       Content user = (Content) o;
+                       if (user != null) {
+                               cmsView.sendEvent(SuiteUxEvent.openNewPart.topic(), SuiteUxEvent.eventProperties(user));
+                       }
+               });
+
+               addItem.addSelectionListener((Selected) (e) -> {
+//                     if (e.detail == SWT.ARROW) {
+                       Rectangle rect = addItem.getBounds();
+                       Point pt = new Point(rect.x, rect.y + rect.height);
+                       pt = bottomToolBar.toDisplay(pt);
+                       menu.setLocation(pt.x, pt.y);
+                       menu.setVisible(true);
+//                     }
+               });
+
+               directoriesView.refresh();
+//             usersView.refresh();
+
+               return sashForm;
+       }
+
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               return createUiPart(parent, JcrContent.nodeToContent(context));
+       }
+
+       public void setContentRepository(ContentRepository contentRepository) {
+               this.contentRepository = contentRepository;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/PersonUiProvider.java
new file mode 100644 (file)
index 0000000..a7be1ef
--- /dev/null
@@ -0,0 +1,215 @@
+package org.argeo.app.ui.people;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.QNamed;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.app.SuiteRole;
+import org.argeo.api.cms.auth.RoleNameUtils;
+import org.argeo.api.cms.auth.SystemRole;
+import org.argeo.api.cms.directory.CmsGroup;
+import org.argeo.api.cms.directory.CmsUser;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.HierarchyUnit.Type;
+import org.argeo.app.swt.ux.SuiteSwtUtils;
+import org.argeo.app.ux.SuiteMsg;
+import org.argeo.app.ux.SuiteStyle;
+import org.argeo.cms.CmsMsg;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.Localized;
+import org.argeo.cms.auth.CmsSystemRole;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.Selected;
+import org.argeo.cms.swt.acr.SwtSection;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.dialogs.CmsFeedback;
+import org.argeo.cms.swt.widgets.EditableText;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+/** Edit a suite user. */
+public class PersonUiProvider implements SwtUiProvider {
+       private CmsUserManager cmsUserManager;
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               SwtSection main = new SwtSection(parent, SWT.NONE, context);
+               main.setLayoutData(CmsSwtUtils.fillAll());
+
+               main.setLayout(new GridLayout(2, false));
+
+               CmsUser user = context.adapt(CmsUser.class);
+
+               Content hierarchyUnitContent = context.getParent().getParent();
+               HierarchyUnit hierarchyUnit = hierarchyUnitContent.adapt(HierarchyUnit.class);
+
+               String roleContext = RoleNameUtils.getContext(user.getName());
+
+               if (context.hasContentClass(LdapObj.person.qName())) {
+
+                       addFormLine(main, SuiteMsg.firstName, context, LdapAttr.givenName);
+                       addFormLine(main, SuiteMsg.lastName, context, LdapAttr.sn);
+                       addFormLine(main, SuiteMsg.email, context, LdapAttr.mail);
+               }
+
+               if (context.hasContentClass(LdapObj.posixAccount.qName())) {
+                       if (hierarchyUnitContent.hasContentClass(LdapObj.organization)) {
+                               SwtSection rolesSection = new SwtSection(main, SWT.NONE);
+                               rolesSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
+                               rolesSection.setLayout(new GridLayout(2, false));
+                               List<String> roles = Arrays.asList(cmsUserManager.getUserRoles(user.getName()));
+                               addRoleCheckBox(rolesSection, hierarchyUnit, user, SuiteMsg.coworkerRole, SuiteRole.coworker,
+                                               roleContext, roles);
+                               addRoleCheckBox(rolesSection, hierarchyUnit, user, SuiteMsg.publisherRole, SuiteRole.publisher,
+                                               roleContext, roles);
+                               addRoleCheckBox(rolesSection, hierarchyUnit, user, SuiteMsg.userAdminRole, CmsSystemRole.userAdmin,
+                                               roleContext, roles);
+                       }
+//                     Composite facetsSection = new Composite(main, SWT.NONE);
+//                     facetsSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
+//                     facetsSection.setLayout(new GridLayout());
+//                     if (context.hasContentClass(LdapObjs.groupOfNames.qName())) {
+//                             String[] members = context.attr(LdapAttrs.member.qName()).split("\n");
+//                             for (String member : members) {
+//                                     new Label(facetsSection, SWT.NONE).setText(member);
+//                             }
+//                     }
+                       if (CurrentUser.implies(CmsSystemRole.userAdmin, roleContext)) {
+                               SwtSection changePasswordSection = new SwtSection(main, SWT.BORDER);
+                               changePasswordSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
+                               changePasswordSection.setLayout(new GridLayout(2, false));
+//                             SuiteUiUtils.addFormLabel(changePasswordSection, CmsMsg.changePassword)
+//                                             .setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false, 2, 1));
+                               SuiteSwtUtils.addFormLabel(changePasswordSection, CmsMsg.newPassword);
+                               Text newPasswordT = SuiteSwtUtils.addFormTextField(changePasswordSection, null, null,
+                                               SWT.PASSWORD | SWT.BORDER);
+                               newPasswordT.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+                               SuiteSwtUtils.addFormLabel(changePasswordSection, CmsMsg.repeatNewPassword);
+                               Text repeatNewPasswordT = SuiteSwtUtils.addFormTextField(changePasswordSection, null, null,
+                                               SWT.PASSWORD | SWT.BORDER);
+                               repeatNewPasswordT.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+                               Button apply = new Button(changePasswordSection, SWT.FLAT);
+                               apply.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false, 2, 1));
+                               apply.setText(CmsMsg.changePassword.lead());
+                               apply.addSelectionListener((Selected) (e) -> {
+                                       try {
+                                               char[] newPassword = newPasswordT.getTextChars();
+                                               char[] repeatNewPassword = repeatNewPasswordT.getTextChars();
+                                               if (newPassword.length > 0 && Arrays.equals(newPassword, repeatNewPassword)) {
+                                                       cmsUserManager.resetPassword(user.getName(), newPassword);
+                                                       CmsFeedback.show(CmsMsg.passwordChanged.lead());
+                                               } else {
+                                                       CmsFeedback.error(CmsMsg.invalidPassword.lead(), null);
+                                               }
+                                       } catch (Exception e1) {
+                                               CmsFeedback.error(CmsMsg.invalidPassword.lead(), e1);
+                                       }
+                               });
+                       }
+               }
+
+               return main;
+       }
+
+       private void addFormLine(SwtSection parent, Localized msg, Content content, QNamed attr) {
+               SuiteSwtUtils.addFormLabel(parent, msg.lead());
+               EditableText text = new EditableText(parent, SWT.SINGLE | SWT.FLAT);
+               text.setLayoutData(CmsSwtUtils.fillWidth());
+               text.setStyle(SuiteStyle.simpleInput);
+               String txt = content.attr(attr);
+               if (txt == null) // FIXME understand why email is not found in IPA
+                       txt = "";
+               text.setText(txt);
+               text.setMouseListener(new MouseAdapter() {
+
+                       private static final long serialVersionUID = 1L;
+
+                       @Override
+                       public void mouseDoubleClick(MouseEvent e) {
+                               String currentTxt = text.getText();
+                               text.startEditing();
+                               text.setText(currentTxt);
+                               ((Text) text.getControl()).addSelectionListener(new SelectionListener() {
+
+                                       private static final long serialVersionUID = 1L;
+
+                                       @Override
+                                       public void widgetSelected(SelectionEvent e) {
+                                       }
+
+                                       @Override
+                                       public void widgetDefaultSelected(SelectionEvent e) {
+                                               String editedTxt = text.getText();
+                                               content.put(attr, editedTxt);
+                                               text.stopEditing();
+                                               text.setText(editedTxt);
+                                               text.getParent().layout(new Control[] { text.getControl() });
+                                       }
+                               });
+                       }
+
+               });
+       }
+
+       private void addRoleCheckBox(SwtSection parent, HierarchyUnit hierarchyUnit, CmsUser user, Localized msg,
+                       SystemRole systemRole, String roleContext, List<String> roles) {
+               Button radio = new Button(parent, SWT.CHECK);
+               radio.setSelection(false);
+               roles: for (String dn : roles) {
+                       if (systemRole.implied(dn, roleContext)) {
+                               radio.setSelection(true);
+                               break roles;
+                       }
+               }
+
+               if (systemRole.equals(CmsSystemRole.userAdmin)) {
+                       if (!CurrentUser.isUserContext(roleContext) && CurrentUser.implies(CmsSystemRole.userAdmin, roleContext)) {
+                               // a user admin cannot modify the user admins of their own context
+                               radio.setEnabled(true);
+                       } else {
+                               radio.setEnabled(false);
+                       }
+               } else {
+                       radio.setEnabled(CurrentUser.implies(CmsSystemRole.userAdmin, roleContext));
+               }
+
+               radio.addSelectionListener((Selected) (e) -> {
+                       HierarchyUnit rolesHu = hierarchyUnit.getDirectChild(Type.ROLES);
+                       CmsGroup roleGroup = cmsUserManager.getOrCreateSystemRole(rolesHu, systemRole.qName());
+                       if (radio.getSelection())
+                               cmsUserManager.addMember(roleGroup, user);
+                       else
+                               cmsUserManager.removeMember(roleGroup, user);
+               });
+
+               new Label(parent, 0).setText(msg.lead());
+
+       }
+
+       public void setCmsUserManager(CmsUserManager cmsUserManager) {
+               this.cmsUserManager = cmsUserManager;
+       }
+
+//     private String getUserProperty(Object element, String key) {
+//             Object value = ((User) element).getProperties().get(key);
+//             return value != null ? value.toString() : null;
+//     }
+
+       public void init(Map<String, Object> properties) {
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UserColumn.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UserColumn.java
new file mode 100644 (file)
index 0000000..35610f3
--- /dev/null
@@ -0,0 +1,42 @@
+package org.argeo.app.ui.people;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ldap.LdapAcrUtils;
+import org.argeo.api.acr.ldap.LdapAttr;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.cms.directory.CmsUser;
+import org.argeo.api.cms.ux.CmsIcon;
+import org.argeo.app.ux.SuiteIcon;
+import org.argeo.cms.CurrentUser;
+import org.argeo.cms.ux.widgets.Column;
+
+public class UserColumn implements Column<Content> {
+       @Override
+       public String getText(Content role) {
+               if (role.hasContentClass(LdapObj.inetOrgPerson))
+                       return role.adapt(CmsUser.class).getDisplayName();
+               else if (role.hasContentClass(LdapObj.organization))
+                       return role.attr(LdapAttr.o);
+               else if (role.hasContentClass(LdapObj.groupOfNames)) {
+                       // TODO make it more generic at ACR level
+                       Object label = LdapAcrUtils.getLocalized(role, LdapAttr.cn.qName(), CurrentUser.locale());
+                       return label.toString();
+               } else
+                       return null;
+       }
+
+       @Override
+       public CmsIcon getIcon(Content role) {
+               if (role.hasContentClass(LdapObj.posixAccount))
+                       return SuiteIcon.user;
+               else if (role.hasContentClass(LdapObj.inetOrgPerson))
+                       return SuiteIcon.person;
+               else if (role.hasContentClass(LdapObj.organization))
+                       return SuiteIcon.organisationContact;
+               else if (role.hasContentClass(LdapObj.groupOfNames))
+                       return SuiteIcon.group;
+               else
+                       return null;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UsersPart.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/UsersPart.java
new file mode 100644 (file)
index 0000000..aaa8115
--- /dev/null
@@ -0,0 +1,59 @@
+package org.argeo.app.ui.people;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.acr.ContentSession;
+import org.argeo.api.acr.ldap.LdapObj;
+import org.argeo.api.cms.directory.CmsRole;
+import org.argeo.api.cms.directory.CmsUserManager;
+import org.argeo.api.cms.directory.HierarchyUnit;
+import org.argeo.api.cms.directory.UserDirectory;
+import org.argeo.cms.acr.ContentUtils;
+import org.argeo.cms.ux.widgets.DefaultTabularPart;
+
+public class UsersPart extends DefaultTabularPart<HierarchyUnit, Content> {
+       private ContentSession contentSession;
+       private CmsUserManager cmsUserManager;
+
+       public UsersPart(ContentSession contentSession, CmsUserManager cmsUserManager) {
+               this.contentSession = contentSession;
+               this.cmsUserManager = cmsUserManager;
+               addColumn(new UserColumn() {
+
+                       @Override
+                       public int getWidth() {
+                               return 300;
+                       }
+
+               });
+       }
+
+       @Override
+       protected List<Content> asList(HierarchyUnit hu) {
+               List<Content> roles = new ArrayList<>();
+               UserDirectory ud = (UserDirectory) hu.getDirectory();
+               if (ud.getRealm().isPresent()) {
+                       for (CmsRole r : ud.getHierarchyUnitRoles(ud, null, true)) {
+                               Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r);
+                               if (content.hasContentClass(LdapObj.inetOrgPerson, LdapObj.organization))
+                                       roles.add(content);
+                       }
+
+               } else {
+                       for (HierarchyUnit directChild : hu.getDirectHierarchyUnits(false)) {
+                               if (!(directChild.isType(HierarchyUnit.Type.FUNCTIONAL)
+                                               || directChild.isType(HierarchyUnit.Type.ROLES))) {
+                                       for (CmsRole r : ud.getHierarchyUnitRoles(directChild, null, false)) {
+                                               Content content = ContentUtils.roleToContent(cmsUserManager, contentSession, r);
+                                               if (content.hasContentClass(LdapObj.inetOrgPerson, LdapObj.organization, LdapObj.groupOfNames))
+                                                       roles.add(content);
+                                       }
+                               }
+                       }
+               }
+               return roles;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/vcard/VCardExporter.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/people/vcard/VCardExporter.java
new file mode 100644 (file)
index 0000000..1b5274e
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.app.ui.people.vcard;
+
+import ezvcard.Ezvcard;
+import ezvcard.VCard;
+
+public class VCardExporter {
+
+       public static void main(String[] args) {
+               String str = "BEGIN:VCARD\r\n" + "VERSION:4.0\r\n" + "N:Doe;Jonathan;;Mr;\r\n" + "FN:John Doe\r\n"
+                               + "END:VCARD\r\n";
+
+               VCard vcard = Ezvcard.parse(str).first();
+               String fullName = vcard.getFormattedName().getValue();
+               String lastName = vcard.getStructuredName().getFamily();
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/DocumentUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/DocumentUiProvider.java
new file mode 100644 (file)
index 0000000..554ad90
--- /dev/null
@@ -0,0 +1,67 @@
+package org.argeo.app.ui.publish;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.api.cms.ux.CmsView;
+import org.argeo.app.docbook.DbkType;
+import org.argeo.app.ui.docbook.AbstractDbkViewer;
+import org.argeo.app.ui.docbook.DocumentTextEditor;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.widgets.ScrolledPage;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.util.CmsLink;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.argeo.cms.ui.viewers.JcrVersionCmsEditable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public class DocumentUiProvider implements CmsUiProvider {
+
+       @Override
+       public Control createUi(Composite parent, Node context) throws RepositoryException {
+               CmsView cmsView = CmsSwtUtils.getCmsView(parent);
+               CmsEditable cmsEditable = new JcrVersionCmsEditable(context);
+               if (context.hasNode(DbkType.article.get())) {
+                       Node textNode = context.getNode(DbkType.article.get());
+                       // Title
+                       parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
+
+                       Composite links = new Composite(parent, SWT.NONE);
+                       FillLayout linksLayout = new FillLayout();
+                       linksLayout.spacing = 2;
+                       links.setLayout(linksLayout);
+                       CmsLink toHtml = new CmsLink("to HTML", "/html/dbk" + context.getPath() + "/index.html");
+                       toHtml.createUiPart(links, context);
+                       CmsLink toPdf = new CmsLink("to PDF", "/html/dbk" + context.getPath() + "/index.pdf");
+                       toPdf.createUiPart(links, context);
+
+                       ScrolledPage page = new ScrolledPage(parent, SWT.NONE);
+                       page.setLayoutData(CmsSwtUtils.fillAll());
+                       page.setLayout(CmsSwtUtils.noSpaceGridLayout());
+
+                       cmsView.runAs(() -> {
+                               AbstractDbkViewer dbkEditor = new DocumentTextEditor(page, SWT.NONE, textNode, cmsEditable);
+                               dbkEditor.refresh();
+                       });
+                       return page;
+
+               } else if (context.isNodeType(NodeType.NT_FILE)) {
+                       String fileName = context.getName();
+                       if (fileName.endsWith(".pdf")) {
+                               Browser browser = new Browser(parent, SWT.NONE);
+                               String dataPath = CmsUiUtils.getDataPath(context);
+                               browser.setUrl(dataPath);
+                               browser.setLayoutData(CmsSwtUtils.fillAll());
+                               return browser;
+                       }
+               }
+               return null;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PdfViewer.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PdfViewer.java
new file mode 100644 (file)
index 0000000..57f77f3
--- /dev/null
@@ -0,0 +1,37 @@
+package org.argeo.app.ui.publish;
+
+import java.awt.image.BufferedImage;
+import java.nio.file.Paths;
+
+//import org.apache.pdfbox.pdmodel.PDDocument;
+//import org.apache.pdfbox.rendering.PDFRenderer;
+import org.argeo.eclipse.ui.specific.BufferedImageDisplay;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+public class PdfViewer {
+       public static void main(String[] args) throws Exception {
+//             PDDocument doc = PDDocument.load(Paths.get(args[0]).toFile());
+//             PDFRenderer renderer = new PDFRenderer(doc);
+//
+//             BufferedImage image = renderer.renderImageWithDPI(0, 300);
+//
+//             Display display = new Display();
+//             Shell shell = new Shell(display);
+//             shell.setLayout(new FillLayout());
+//
+//             shell.setSize(200, 200);
+//
+//             BufferedImageDisplay imageDisplay = new BufferedImageDisplay(shell, SWT.NONE);
+//             imageDisplay.setImage(image);
+//
+//             shell.open();
+//             while (!shell.isDisposed()) {
+//                     if (!display.readAndDispatch())
+//                             display.sleep();
+//             }
+//             display.dispose();
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishEntryArea.java
new file mode 100644 (file)
index 0000000..8aafded
--- /dev/null
@@ -0,0 +1,16 @@
+package org.argeo.app.ui.publish;
+
+import org.argeo.api.acr.Content;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public class PublishEntryArea implements SwtUiProvider {
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishUiProvider.java
new file mode 100644 (file)
index 0000000..1c77042
--- /dev/null
@@ -0,0 +1,26 @@
+package org.argeo.app.ui.publish;
+
+import org.argeo.api.acr.Content;
+import org.argeo.api.cms.ux.CmsEditable;
+import org.argeo.app.swt.docbook.DocBookViewer;
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.cms.swt.acr.SwtUiProvider;
+import org.argeo.cms.swt.widgets.ScrolledPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public class PublishUiProvider implements SwtUiProvider {
+
+       @Override
+       public Control createUiPart(Composite parent, Content context) {
+               ScrolledPage page = new ScrolledPage(parent, SWT.NONE);
+               page.setLayoutData(CmsSwtUtils.fillAll());
+               page.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               DocBookViewer docBookViewer = new DocBookViewer(page, 0, context, CmsEditable.NON_EDITABLE);
+//             docBookViewer.setLayoutData(CmsSwtUtils.fillAll());
+               docBookViewer.refresh();
+               return docBookViewer.getControl();
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishingApp.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishingApp.java
new file mode 100644 (file)
index 0000000..9057a6b
--- /dev/null
@@ -0,0 +1,125 @@
+package org.argeo.app.ui.publish;
+
+import static org.argeo.app.swt.ux.SwtArgeoApp.DEFAULT_THEME_ID_PROPERTY;
+import static org.argeo.app.swt.ux.SwtArgeoApp.DEFAULT_UI_NAME_PROPERTY;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.Session;
+
+import org.argeo.api.cms.CmsApp;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.ux.CmsUi;
+import org.argeo.app.swt.ux.SwtArgeoApp;
+import org.argeo.cms.AbstractCmsApp;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.util.LangUtils;
+import org.argeo.jcr.Jcr;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.osgi.framework.Constants;
+
+/**
+ * A {@link CmsApp} dedicated to publishing, typically a public or internal web
+ * site.
+ */
+public class PublishingApp extends AbstractCmsApp {
+       private final static CmsLog log = CmsLog.getLog(PublishingApp.class);
+
+       private String pid;
+       private String defaultThemeId;
+       private String defaultUiName = "";
+
+       private String publicBasePath = null;
+
+       private CmsUiProvider landingPage;
+       private CmsUiProvider defaultProvider = new DocumentUiProvider();
+
+       private Repository repository;
+
+       public void init(Map<String, String> properties) {
+               if (properties.containsKey(DEFAULT_UI_NAME_PROPERTY))
+                       defaultUiName = LangUtils.get(properties, DEFAULT_UI_NAME_PROPERTY);
+               if (properties.containsKey(DEFAULT_THEME_ID_PROPERTY))
+                       defaultThemeId = LangUtils.get(properties, DEFAULT_THEME_ID_PROPERTY);
+               publicBasePath = LangUtils.get(properties, SwtArgeoApp.PUBLIC_BASE_PATH_PROPERTY);
+               pid = properties.get(Constants.SERVICE_PID);
+
+               if (log.isDebugEnabled())
+                       log.info("Publishing App " + pid + " started");
+       }
+
+       public void destroy(Map<String, String> properties) {
+               if (log.isDebugEnabled())
+                       log.info("Publishing App " + pid + " stopped");
+
+       }
+
+       @Override
+       public Set<String> getUiNames() {
+               Set<String> uiNames = new HashSet<>();
+               uiNames.add(defaultUiName);
+               return uiNames;
+       }
+
+       @Override
+       public CmsUi initUi(Object uiParent) {
+               Composite parent = (Composite) uiParent;
+//             Session adminSession = NodeUtils.openDataAdminSession(getRepository(), null);
+               Session session = Jcr.login(getRepository(), null);
+               parent.setLayout(new GridLayout());
+               Node indexNode = Jcr.getNode(session, publicBasePath + "/index");
+//             try {
+//                     indexNode = JcrUtils.getOrAdd(Jcr.getRootNode(adminSession), DocumentPage.WWW, DbkType.article.get());
+//                     adminSession.save();
+//             } catch (RepositoryException e) {
+//                     throw new IllegalStateException(e);
+//             }
+
+               Control page;
+               if (landingPage != null) {
+                       page = landingPage.createUiPart(parent, indexNode);
+               } else {
+                       page = defaultProvider.createUiPart(parent, indexNode);
+               }
+               return (CmsUi) page;
+       }
+
+       @Override
+       public void refreshUi(CmsUi cmsUi, String state) {
+               Composite parent = (Composite) cmsUi;
+               parent.setLayout(new GridLayout());
+               if (landingPage != null)
+                       landingPage.createUiPart(parent, (Node) null);
+               else
+                       defaultProvider.createUiPart(parent, (Node) null);
+       }
+
+       @Override
+       public void setState(CmsUi cmsUi, String state) {
+
+       }
+
+       @Override
+       protected String getThemeId(String uiName) {
+               return defaultThemeId;
+       }
+
+       public void setLandingPage(CmsUiProvider landingPage) {
+               this.landingPage = landingPage;
+       }
+
+       public Repository getRepository() {
+               return repository;
+       }
+
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishingStyle.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/publish/PublishingStyle.java
new file mode 100644 (file)
index 0000000..256055c
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.app.ui.publish;
+
+import org.argeo.api.cms.ux.CmsStyle;
+
+/** Publishing styles. */
+public enum PublishingStyle implements CmsStyle {
+       // general
+       page, coverTitle, coverSubTitle, coverTagline, bannerLine1, bannerLine2,
+       // meta data
+       tag, menu,
+       // text style
+       title, subTitle, chapo, para, sectionTitle, subSectionTitle,
+       // links
+       internalLink,
+       // composite style
+       framed, line;
+
+       @Override
+       public String getClassPrefix() {
+               return "argeo-publishing";
+       }
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/AbstractConnectContextMenu.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/AbstractConnectContextMenu.java
new file mode 100644 (file)
index 0000000..7824691
--- /dev/null
@@ -0,0 +1,133 @@
+package org.argeo.app.ui.widgets;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * Generic popup context menu for TableViewer to enable single sourcing between
+ * CMS and Workbench
+ */
+public abstract class AbstractConnectContextMenu {
+
+       private Shell parentShell;
+       private Shell shell;
+       // Local context
+
+       private final static String KEY_ACTION_ID = "actionId";
+       private final String[] defaultActions;
+       private Map<String, Button> actionButtons = new HashMap<String, Button>();
+
+       public AbstractConnectContextMenu(Display display, String[] defaultActions) {
+               parentShell = display.getActiveShell();
+               shell = new Shell(parentShell, SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+               this.defaultActions = defaultActions;
+       }
+
+       protected void createControl() {
+               shell.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               Composite boxCmp = new Composite(shell, SWT.NO_FOCUS | SWT.BORDER);
+               boxCmp.setLayout(EclipseUiUtils.noSpaceGridLayout());
+//             CmsUiUtils.style(boxCmp, ConnectUiStyles.CONTEXT_MENU_BOX);
+               createContextMenu(boxCmp);
+               shell.addShellListener(new ActionsShellListener());
+       }
+
+       protected void createContextMenu(Composite boxCmp) {
+               ActionsSelListener asl = new ActionsSelListener();
+               for (String actionId : defaultActions) {
+                       Button btn = new Button(boxCmp, SWT.FLAT | SWT.LEAD);
+                       btn.setText(getLabel(actionId));
+                       btn.setLayoutData(EclipseUiUtils.fillWidth());
+                       CmsSwtUtils.markup(btn);
+//                     CmsUiUtils.style(btn, actionId + ConnectUiStyles.BUTTON_SUFFIX);
+                       btn.setData(KEY_ACTION_ID, actionId);
+                       btn.addSelectionListener(asl);
+                       actionButtons.put(actionId, btn);
+               }
+       }
+
+       protected void setVisible(boolean visible, String... buttonIds) {
+               for (String id : buttonIds) {
+                       Button button = actionButtons.get(id);
+                       button.setVisible(visible);
+                       GridData gd = (GridData) button.getLayoutData();
+                       gd.heightHint = visible ? SWT.DEFAULT : 0;
+               }
+       }
+
+       public void show(Control source, Point location, IStructuredSelection selection) {
+               if (shell.isDisposed()) {
+                       shell = new Shell(Display.getCurrent(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP);
+                       createControl();
+               }
+               if (shell.isVisible())
+                       shell.setVisible(false);
+
+               if (aboutToShow(source, location, selection)) {
+                       shell.pack();
+                       shell.layout();
+                       if (source instanceof Control)
+                               shell.setLocation(((Control) source).toDisplay(location.x, location.y));
+                       shell.open();
+               }
+       }
+
+       protected Shell getParentShell() {
+               return parentShell;
+       }
+
+       class StyleButton extends Label {
+               private static final long serialVersionUID = 7731102609123946115L;
+
+               public StyleButton(Composite parent, int swtStyle) {
+                       super(parent, swtStyle);
+               }
+       }
+
+       class ActionsSelListener extends SelectionAdapter {
+               private static final long serialVersionUID = -1041871937815812149L;
+
+               @Override
+               public void widgetSelected(SelectionEvent e) {
+                       Object eventSource = e.getSource();
+                       if (eventSource instanceof Button) {
+                               Button pressedBtn = (Button) eventSource;
+                               performAction((String) pressedBtn.getData(KEY_ACTION_ID));
+                               shell.close();
+                       }
+               }
+       }
+
+       class ActionsShellListener extends org.eclipse.swt.events.ShellAdapter {
+               private static final long serialVersionUID = -5092341449523150827L;
+
+               @Override
+               public void shellDeactivated(ShellEvent e) {
+                       setVisible(false);
+                       shell.setVisible(false);
+                       //shell.close();
+               }
+       }
+
+       protected abstract boolean performAction(String actionId);
+
+       protected abstract boolean aboutToShow(Control source, Point location, IStructuredSelection selection);
+
+       protected abstract String getLabel(String actionId);
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/ConnectAbstractDropDown.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/ConnectAbstractDropDown.java
new file mode 100644 (file)
index 0000000..d1f1a29
--- /dev/null
@@ -0,0 +1,194 @@
+package org.argeo.app.ui.widgets;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.eclipse.rap.rwt.widgets.DropDown;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * Enable easy addition of a {@code DropDown} widget to a text with listeners
+ * configured
+ */
+public abstract class ConnectAbstractDropDown {
+
+       private final Text text;
+       private final DropDown dropDown;
+       private boolean modifyFromList = false;
+
+       // Current displayed text
+       private String userText = "";
+       // Current displayed list items
+       private String[] values;
+
+       // Fine tuning
+       boolean readOnly;
+       boolean refreshOnFocus;
+
+       /** Implementing classes should call refreshValues() after initialisation */
+       public ConnectAbstractDropDown(Text text) {
+               this(text, SWT.NONE, false);
+       }
+
+       /**
+        * Implementing classes should call refreshValues() after initialisation
+        * 
+        * @param text
+        * @param style
+        *            only SWT.READ_ONLY is understood, check if the entered text is
+        *            part of the legal choices.
+        */
+       public ConnectAbstractDropDown(Text text, int style) {
+               this(text, style, false);
+       }
+
+       /**
+        * Implementers should call refreshValues() once init has been done.
+        * 
+        * @param text
+        * @param style
+        *            only SWT.READ_ONLY is understood, check if the entered text is
+        *            part of the legal choices.
+        * @param refreshOnFocus
+        *            if true, the possible values are computed each time the focus is
+        *            gained. It enables, among other to fine tune the getFilteredValues
+        *            method depending on the current context
+        */
+       public ConnectAbstractDropDown(Text text, int style, boolean refreshOnFocus) {
+               this.text = text;
+               dropDown = new DropDown(text);
+               Object obj = dropDown;
+               if (obj instanceof Widget)
+                       CmsSwtUtils.markup((Widget) obj);
+               readOnly = (style & SWT.READ_ONLY) != 0;
+               this.refreshOnFocus = refreshOnFocus;
+               addListeners();
+       }
+
+       /**
+        * Overwrite to force the refresh of the possible values on focus gained event
+        */
+       protected boolean refreshOnFocus() {
+               return refreshOnFocus;
+       }
+
+       public String getText() {
+               return text.getText();
+       }
+
+       public void init() {
+               refreshValues();
+       }
+
+       public void reset(String value) {
+               modifyFromList = true;
+               if (EclipseUiUtils.notEmpty(value))
+                       text.setText(value);
+               else
+                       text.setText("");
+               refreshValues();
+               modifyFromList = false;
+       }
+
+       /** Overwrite to provide specific filtering */
+       protected abstract List<String> getFilteredValues(String filter);
+
+       protected void refreshValues() {
+               List<String> filteredValues = getFilteredValues(text.getText());
+               values = filteredValues.toArray(new String[filteredValues.size()]);
+               dropDown.setItems(values);
+       }
+
+       protected void addListeners() {
+               addModifyListener();
+               addSelectionListener();
+               addDefaultSelectionListener();
+               addFocusListener();
+       }
+
+       protected void addFocusListener() {
+               text.addFocusListener(new FocusListener() {
+                       private static final long serialVersionUID = -7179112097626535946L;
+
+                       public void focusGained(FocusEvent event) {
+                               if (refreshOnFocus) {
+                                       modifyFromList = true;
+                                       refreshValues();
+                                       modifyFromList = false;
+                               }
+                               dropDown.setVisible(true);
+                       }
+
+                       public void focusLost(FocusEvent event) {
+                               dropDown.setVisible(false);
+                               if (readOnly && values != null && !Arrays.asList(values).contains(userText)) {
+                                       modifyFromList = true;
+                                       text.setText("");
+                                       refreshValues();
+                                       modifyFromList = false;
+                               }
+                       }
+               });
+       }
+
+       private void addSelectionListener() {
+               Object obj = dropDown;
+               if (obj instanceof Widget)
+                       ((Widget) obj).addListener(SWT.Selection, new Listener() {
+                               private static final long serialVersionUID = -2357157809365135142L;
+
+                               public void handleEvent(Event event) {
+                                       if (event.index != -1) {
+                                               modifyFromList = true;
+                                               text.setText(values[event.index]);
+                                               modifyFromList = false;
+                                               text.selectAll();
+                                       } else {
+                                               text.setText(userText);
+                                               text.setSelection(userText.length(), userText.length());
+                                               text.setFocus();
+                                       }
+                               }
+                       });
+       }
+
+       private void addDefaultSelectionListener() {
+               Object obj = dropDown;
+               if (obj instanceof Widget)
+                       ((Widget) obj).addListener(SWT.DefaultSelection, new Listener() {
+                               private static final long serialVersionUID = -5958008322630466068L;
+
+                               public void handleEvent(Event event) {
+                                       if (event.index != -1) {
+                                               text.setText(values[event.index]);
+                                               text.setSelection(event.text.length());
+                                               dropDown.setVisible(false);
+                                       }
+                               }
+                       });
+       }
+
+       private void addModifyListener() {
+               text.addListener(SWT.Modify, new Listener() {
+                       private static final long serialVersionUID = -4373972835244263346L;
+
+                       public void handleEvent(Event event) {
+                               if (!modifyFromList) {
+                                       userText = text.getText();
+                                       refreshValues();
+                                       if (values.length == 1)
+                                               dropDown.setSelectionIndex(0);
+                                       dropDown.setVisible(true);
+                               }
+                       }
+               });
+       }
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/DelayedText.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/DelayedText.java
new file mode 100644 (file)
index 0000000..a22d74b
--- /dev/null
@@ -0,0 +1,92 @@
+package org.argeo.app.ui.widgets;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import org.eclipse.rap.rwt.service.ServerPushSession;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * A text input which notifies changes after a delay, typically in order to
+ * apply a filter.
+ */
+public class DelayedText {
+       private final static ScheduledExecutorService scheduler;
+       static {
+               // create only one scheduler, in order not to exhaust threads
+               scheduler = Executors.newScheduledThreadPool(0, (r) -> {
+                       Thread thread = new Thread(r, "Delayed text scheduler");
+                       // we mark threads as deamons so that the shutdown hook is triggered
+                       thread.setDaemon(true);
+                       return thread;
+               });
+               Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+                       scheduler.shutdown();
+               }, "Shutdown delayed text scheduler"));
+       }
+       private final static int DEFAULT_DELAY = 800;
+
+       private final long delay;
+       private final InternalModifyListener modifyListener;
+       private final Text text;
+       protected List<Consumer<String>> toDos = new ArrayList<>();
+       private ServerPushSession pushSession;
+
+       private ScheduledFuture<String> lastTask;
+
+       public DelayedText(Composite parent, int style) {
+               this(parent, style, DEFAULT_DELAY);
+       }
+
+       public DelayedText(Composite parent, int style, long delayInMs) {
+               this.delay = delayInMs;
+               this.modifyListener = new InternalModifyListener();
+               pushSession = new ServerPushSession();
+               text = new Text(parent, style);
+               pushSession.start();
+               text.addDisposeListener((e) -> pushSession.stop());
+               text.addModifyListener(modifyListener);
+       }
+
+       protected void notifyText(String txt) {
+               // text.getDisplay().syncExec(()-> pushSession.start());
+               for (Consumer<String> toDo : toDos) {
+                       text.getDisplay().syncExec(() -> toDo.accept(txt));
+               }
+               // text.getDisplay().syncExec(()->pushSession.stop());
+       }
+
+       public Text getText() {
+               return text;
+       }
+
+       public void addListener(Consumer<String> toDo) {
+               toDos.add(toDo);
+       }
+
+       private class InternalModifyListener implements ModifyListener {
+               private static final long serialVersionUID = -6178431173400385005L;
+
+               public void modifyText(ModifyEvent e) {
+                       String txt = text.getText();
+                       ScheduledFuture<String> task = scheduler.schedule(() -> {
+                               notifyText(txt);
+                               return txt;
+                       }, delay, TimeUnit.MILLISECONDS);
+                       // cancel previous task
+                       if (lastTask != null && !lastTask.isDone()) {
+                               lastTask.cancel(false);
+                       }
+                       lastTask = task;
+               }
+       };
+
+}
diff --git a/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/TreeOrSearchArea.java b/swt/org.argeo.app.ui/src/org/argeo/app/ui/widgets/TreeOrSearchArea.java
new file mode 100644 (file)
index 0000000..2b8f54e
--- /dev/null
@@ -0,0 +1,74 @@
+package org.argeo.app.ui.widgets;
+
+import org.argeo.cms.swt.CmsSwtUtils;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Displays a tree by default, which becomes a list if the search text field is
+ * used.
+ */
+public class TreeOrSearchArea extends Composite {
+       private static final long serialVersionUID = -1302546480076719532L;
+
+       private Text searchT;
+       private StackLayout bodyLayout;
+
+       private TreeViewer treeViewer;
+       private TreeViewer searchResultsViewer;
+
+       public TreeOrSearchArea(Composite parent, int style) {
+               super(parent, style);
+               createUi(this);
+       }
+
+       protected void createUi(Composite parent) {
+               parent.setLayout(new GridLayout());
+               Composite searchC = new Composite(parent, SWT.NONE);
+               searchC.setLayout(new GridLayout());
+               searchC.setLayoutData(CmsSwtUtils.fillWidth());
+               createSearchUi(searchC);
+
+               Composite bodyC = new Composite(parent, SWT.NONE);
+               bodyC.setLayoutData(CmsSwtUtils.fillAll());
+               bodyLayout = new StackLayout();
+               bodyC.setLayout(bodyLayout);
+               Composite treeC = new Composite(bodyC, SWT.NONE);
+               createTreeUi(treeC);
+               Composite searchResultsC = new Composite(bodyC, SWT.NONE);
+               createSearchResultsUi(searchResultsC);
+
+               bodyLayout.topControl = treeC;
+       }
+
+       protected void createSearchUi(Composite parent) {
+               parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               searchT = new Text(parent, SWT.MULTI | SWT.BORDER);
+               searchT.setLayoutData(CmsSwtUtils.fillWidth());
+       }
+
+       protected void createTreeUi(Composite parent) {
+               parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               treeViewer = new TreeViewer(parent);
+               treeViewer.getTree().setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       protected void createSearchResultsUi(Composite parent) {
+               parent.setLayout(CmsSwtUtils.noSpaceGridLayout());
+               searchResultsViewer = new TreeViewer(parent);
+               searchResultsViewer.getTree().setLayoutData(CmsSwtUtils.fillAll());
+       }
+
+       public TreeViewer getTreeViewer() {
+               return treeViewer;
+       }
+
+       public TreeViewer getSearchResultsViewer() {
+               return searchResultsViewer;
+       }
+
+}